2017-03-18 115 views
1

我尋覓了很多,而我看到一對夫婦使用的這些例子,具體from here##或//在bash shell腳本中的含義是什麼?

scale=${scale##*[!0-9]*} 
[ -z "${scale//[0-9]}" ] 

沒有解釋什麼,這些符號做什麼,他們是如何工作的,或當使用這些腳本。在討論特殊符號時,我沒有在其他地方找到它們。看起來他們可能會有用。任何人都可以解釋##//如何在上面鏈接的頁面上的腳本示例中工作?謝謝。

+1

請發佈您有問題的實際代碼。 – Barmar

+0

http://tldp.org/LDP/abs/html/parameter-substitution.html –

回答

4

它們是shell的一部分parameter expansion語法,用於修改變量的值。 #%用於刪除變量的前綴或後綴,而//用於替換另一個字符串。

${parameter#word}
${parameter##word}
word被擴展,以產生一個模式,就像在文件名擴展(見文件名擴展)。如果模式匹配參數展開值的開始位置,那麼展開結果是最短匹配模式('#'情況)或最長匹配模式('##'情況)的參數展開值。刪除。

所以${scale##*[!0-9]*}意味着刪除字符串的開頭,該字符串匹配任何後面跟非數字的字符後跟任何內容。所以foobar成爲一個空字符串(因爲一切都被刪除),而123被留下,因爲[!0-9]永遠不會匹配任何東西。

${parameter/pattern/string}
圖案被膨脹,以產生一個模式,就像在文件名擴展。參數被擴展並且模式與其值的最長匹配被字符串替換。如果模式以'/'開始,模式的所有匹配都被替換爲字符串。通常只有第一場比賽被取代。如果模式以'#'開頭,則它必須在參數的擴展值的開頭匹配。如果模式以'%'開頭,則它必須在參數的擴展值的末尾匹配。如果string爲空,則刪除pattern的匹配,並且可以省略/ following模式。

所以${scale//[0-9]}簡單地移除從所述變量的值的所有數字,然後test -z用於測試,如果這是一個空字符串(這意味着原來的字符串只有數字)。