解释括号 grep 中的 shell 个变量
Interpreting shell variables in bracket grep
我有这样的命令:
grep ABC /tmp/dir{1,3,7}/file*.txt
它工作得很好,但我需要用这样的文件名提取常量:
FILENAME="/tmp/dir{1,3,7}/file*.txt"
grep ABC $FILENAME
由于大括号,这不起作用。
我该怎么做?
这是 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
您可以使用 eval
来执行以字符串形式给出的命令。
dir{1,2,3} 在此命令后转换为字符串:FILENAME="/tmp/dir{1,3,7}/file*.txt"
运行 eval grep ABC $FILENAME
得到想要的输出
不要为此使用 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 会导致数组为空。
我有这样的命令:
grep ABC /tmp/dir{1,3,7}/file*.txt
它工作得很好,但我需要用这样的文件名提取常量:
FILENAME="/tmp/dir{1,3,7}/file*.txt"
grep ABC $FILENAME
由于大括号,这不起作用。 我该怎么做?
这是 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
您可以使用 eval
来执行以字符串形式给出的命令。
dir{1,2,3} 在此命令后转换为字符串:FILENAME="/tmp/dir{1,3,7}/file*.txt"
运行 eval grep ABC $FILENAME
得到想要的输出
不要为此使用 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 会导致数组为空。