2014-10-16 25 views
0

我有一些名爲OBS_SURFACE1 **,OBS_SURFACE101,OBS_SURFACE103的文件。是的,確實有一個名爲OBS_SURFACE1 **的文件,我猜想問題出在哪裏。我寫了有一個bash腳本:來自bash循環的無法解釋的字符串

for fil in ` ls OBS_DOMAIN1?? ` 
do 
    echo "appending" $fil 
done 

FIL的第一個值將是OBS_SURFACE1 ** OBS_SURFACE101 OBS_SURFACE103,第二OBS_SURFACE101。雖然我期望第一個是OBS_SURFACE1 **。如果沒有OBS_SURFACE1 **文件,則不會有問題。那爲什麼呢?

+0

http://mywiki.wooledge.org/ParsingLs – 2014-10-16 20:25:22

+0

http://mywiki.wooledge.org/BashPitfalls – 2014-10-16 20:26:09

+0

此外,你引用的東西,不需要被引用 - 單詞「追加」 ,它不能擴展到除本身之外的任何東西 - 而且不會引用*必須*引用的內容,'$ fil'擴展,這意味着它的結果得到了字符串分割和全局擴展。 – 2014-10-16 20:27:24

回答

3

Don't parse ls!它只會導致問題。使用水珠來代替:

for fil in OBS_DOMAIN1?? 
do 
    echo "appending $fil" 
done 

您所遇到的事實,的ls輸出包含*,其正在擴展的bash莖的問題。請注意,我還引用了整個字符串爲echo ed,這可以防止循環內部出現分詞。請參閱上面評論中提供的鏈接,瞭解更多詳情。

如同指出in the comments(感謝Charles),你可能還想在你的循環之前啓用nullglob這樣:shopt -s nullglob。這將意味着如果沒有與模式匹配的文件,則循環將不會運行,而是使用文字值OBS_DOMAIN1??$fil運行一次。另一種選擇是,以檢查文件是否在循環中存在,例如使用:

if [[ -e "$fil" ]]; then 
    echo "appending $fil" 
fi 

或更緊湊的[[ -e "$fil" ]] && echo "appending $fil"

+1

值得一提的是'nullglob' shopt選項,或者在循環中放置一個'[[-e「$ fil」]]'檢查來處理缺少匹配會導致返回glob表達式本身的情況。 – 2014-10-16 20:26:42

0

尚未這樣做的另一種方式:

echo appending OBS_DOMAIN1?? 

這將列出所有文件,沒有循環需要。

+0

這將輸出「附加file1 file2 file3」,而不是「附加file1」,「附加file2」,「附加file3」分開的行。 – 2014-10-16 22:02:24