2011-01-29 28 views
4

如果glob模式不匹配任何文件,bash將只返回面值模式:灰有等價於bash的'nullglob'選項嗎?

bash-4.1# echo nonexistent-file-* 
nonexistent-file-* 
bash-4.1# 

您可以通過設置nullglob外殼選項來修改默認行爲,如果沒有匹配,你獲得一個空字符串:

bash-4.1# shopt -s nullglob 
bash-4.1# echo nonexistent-file-* 

bash-4.1# 

那麼在ash有沒有相同的選項?

bash-4.1# ash 
~ # echo nonexistent-file-* 
nonexistent-file-* 
~ # shopt -s nullglob 
ash: shopt: not found 
~ # 

回答

3

對於沒有nullglob外殼,例如灰分和破折號:

IFS="`printf '\n\t'`" # Remove 'space', so filenames with spaces work well. 

# Correct glob use: always use "for" loop, prefix glob, check for existence: 
for file in ./* ; do  # Use "./*", NEVER bare "*" 
    if [ -e "$file" ] ; then # Make sure it isn't an empty match 
     COMMAND ... "$file" ... 
    fi 
done 

來源:Filenames and Pathnames in Shell: How to do it correctlycached

+3

我認爲你不需要在這種情況下設置IFS – drizzt

+1

這隻適用於碰巧與自己匹配的球體。它不是nullglob的一般替代品。 –

1

這種方法比檢查存在每次迭代更好的性能:

set q-* 
[ -e "$1" ] || shift 
for z; do echo "$z" 
done 

我們使用set將通配符擴展到shell的參數列表中。如果參數列表的第一個元素不是有效的文件,則glob不會匹配任何內容。 (與一些常見的嘗試不同,即使glob的第一次匹配是在名稱與glob模式相同的文件上,也能正常工作)。

如果不匹配,則參數列表包含單個元素,而我們將它關閉,以便參數列表現在是空的。那麼for循環根本不會執行任何迭代。

否則,我們遍歷glob擴展到的參數列表(這是在for variable之後沒有in elements時的隱式行爲)。