2017-08-19 35 views
1

我可以在Linux命令行中运行以下命令,它正确地列出所有具有ABC-和XYZ-前缀的文件:Linux bash:如何正确使用eval命令?

ls {ABC-,XYZ-}*.xml 

    Result: ABC-01.xml ABC-02.xml ABC-03.xml XYZ-01.xml XYZ-02.xml 

现在,我计算过,我如下可以使用一个变量:

file_pfx={ABC-,XYZ-} 

,然后使用该变量在 “LS” 命令 “EVAL” 组合:

eval 'ls ${file_pfx}*.xml' 

    Result: ls: {ABC-,XYZ-}*.xml: No such file or directory 

我在做什么错?

感谢

+0

您不能支撑expressioni存储在一个变量*。请参阅[手册中的扩展顺序](https://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions)。 –

+0

在实际使用'eval'之前,请参阅[“为什么应该在Bash中避免使用eval,我应该使用什么?”](https://stackoverflow.com/questions/17529220/why-should-eval-be-avoided而不是我应该使用的) – John1024

+0

感谢您提供完整的测试用例和输出! +1 –

回答

1

您应该使用双引号允许变量扩展($file_pfx):

eval "ls ${file_pfx}*.xml" 

通知我假设你的文件名不包含空格。

无论如何,小心使用eval

+0

谢谢,这工作! – user3152289

+2

如果任何文件名包含空格,它将不起作用 –

4

请勿使用eval。您可以使用通配符扩展,而不是:

#! /bin/bash 
shopt -s extglob 
prefix='ABC-|XYZ-' 
ls @($prefix)*.xml 
3

我会因为括号扩展发生之前*参数替换建议您使用数组

$ touch ABC-01.xml ABC-02.xml ABC-03.xml XYZ-01.xml XYZ-02.xml 

$ files=({ABC-,XYZ-}*.xml) 

$ printf "%s\n" "${files[@]}" 
ABC-01.xml 
ABC-02.xml 
ABC-03.xml 
XYZ-01.xml 
XYZ-02.xml