我试图在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: cannot access '{A1,A2}': No such file or directory
我用错了sintax。我该怎么修理它?
最好
使用扩展globing:
shopt -s extglob
filter="A1|A2"
result=(*@($filter)*.txt)
echo "${result[@]}"
你可以使用eval
来实现你想要的(尽管我不是一个大粉丝;eval
应尽可能避免(IMO):
filter="{A1,A2}"
result=$(eval "ls *$filter*.txt")
echo "$result"
如果你坚持使用大括号,可能没有其他方法在任何其他展开(例如变量展开)之前完成。参见man bash
,EXPANSION
和Brace Expansion
章节。
然而,在这个答案中给出了一个可能的解决方案。