2017-04-12 48 views
1

好吧,我已經浪費了一整天的表現非常奇怪的腳本。我發現了一些我無法解釋的東西。當目錄存在時,bash shell會給出奇怪的結果,而不是

ny-02-ops:~$ rm -fr roles 
ny-02-ops:~$ echo role[blerk] 
role[blerk] 
ny-02-ops:~$ echo role[sugar] 
role[sugar] 
ny-02-ops:~$ mkdir roles 
ny-02-ops:~$ echo role[blerk] 
role[blerk] 

這裏是我的「跆拳道」的時刻

ny-02-ops:~$ echo role[sugar] 
roles 
ny-02-ops:~$ mkdir roleb 
ny-02-ops:~$ echo role[blerk] 
roleb 

我知道有一個bash大師那裏誰可以解釋這一點,我將非常感激知道發生了什麼事情。

回答

5

glob中的方括號內的字符之一匹配。如果一個包含元字符(*[...]等)的glob匹配沒有文件名,那麼glob將不會被返回。

echo "role[sugar]" 
echo "role[blerk]" 
+0

有關更多信息,請參閱bash手冊頁中的「路徑名擴展」。 –

+0

我敢打賭,邁克希望他在一天之前提前一點問你!很酷。 – mayersdesign

+0

這意味着'echo r [ovaltine] [layover] [hyperglycemic] [sugardaddy]'將會返回角色,但是'echo r [gassy] [ugtastic] [difficult] [blovatier]'會自行返回。 – JNevill

2

shell的默認行爲是在可能的情況下展開glob,否則將其保持不變。但是,有些方法可以改變這種行爲。

擴大不匹配的水珠爲空字符串(for循環,你可能只是想,如果沒有匹配的文件跳過有用的,例如),使用nullglob

shopt -s nullglob 

如果事實水珠不擴大被認爲是一個錯誤,請使用failglob

shopt -s failglob 

使用shopt -u來取消這些外殼選項。

+0

這很有用,謝謝! –