2017-08-19 41 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