解释括号grep中的shell变量

时间:2016-06-10 13:00:26

标签: shell grep brace-expansion

我有这样的命令:

grep ABC /tmp/dir{1,3,7}/file*.txt

它完全正常,但我需要提取常量和文件名,如下所示:

FILENAME="/tmp/dir{1,3,7}/file*.txt"
grep ABC $FILENAME

由于括号,这不起作用。 我该怎么办?

3 个答案:

答案 0 :(得分:1)

不要使用eval,这不是必需的,也不安全。在bash:

$ cat file1
abc
$ cat file2
dbf
$ shopt -s nullglob
$ x=( file{1,2} )
$ grep 'b' "${x[@]}"
file1:abc
file2:dbf

如果没有与globbing模式匹配的文件名,nullglob option会导致数组为空。

答案 1 :(得分:0)

这是eval可能有用的一种情况 - 并且希望是安全的:

eval grep ABC "$FILENAME"

测试

$ seq 10 > a1
$ seq 10 > a2
$ seq 10 > a3
$ grep 5 a{1..3}
a1:5
a2:5
a3:5

但是如果我们存储在一个变量中它就会得到文字...

$ f=a{1..3}
$ echo $f
a{1..3}
$ echo "$f"
a{1..3}
$ grep 5 "$f"
grep: a{1..3}: No such file or directory

因此使用eval

$ eval echo "$f"
a1 a2 a3
$ eval grep 5 "$f"
a1:5
a2:5
a3:5

答案 2 :(得分:-1)

您可以使用eval执行以字符串形式给出的命令。

dir {1,2,3} 在此命令后转换为字符串:FILENAME="/tmp/dir{1,3,7}/file*.txt"

运行eval grep ABC $FILENAME以获得所需的输出