【问题标题】:Listing files using a variable filter使用变量过滤器列出文件
【发布时间】:2021-12-05 13:51:57
【问题描述】:

我正在尝试在 shell bash 中使用过滤器列出文件。

这个例子有效:

result=$(ls *{A1,A2}*.txt)

echo $result 

file1_A1.txt,file2_A2.txt

但是将过滤器放入变量时,它不起作用:

filter={A1,A2}
result=$(ls *"$filter"*.txt)
echo $result

ls: 无法访问'{A1,A2}': 没有这样的文件或目录

我使用了错误的语法。我该如何解决?

最好的

【问题讨论】:

  • 您可以尝试不使用引号转义 $filter 吗?因为否则它不会扩展
  • 是的,我试过了,但是没用。
  • 请注意:Why not parse ls?
  • Globs 不会在变量赋值中展开。

标签: linux bash variables filter


【解决方案1】:

使用扩展通配符:

shopt -s extglob

filter="A1|A2"
result=(*@($filter)*.txt)
echo "${result[@]}"

【讨论】:

    【解决方案2】:

    您可以使用eval 来实现您想要的(虽然我不是它的忠实粉丝;应该尽可能避免使用eval IMO):

    filter="{A1,A2}"
    result=$(eval "ls *$filter*.txt")
    echo "$result"
    

    如果您坚持使用大括号,可能没有其他方法,因为 大括号扩展 在任何其他扩展(例如变量扩展)之前完成。请参阅man bashEXPANSIONBrace Expansion 部分。

    但是,this answer 中提供了一种可能的解决方法。

    【讨论】:

    • Eval 解决了... tks!这正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多