2016-03-16 55 views
0

請解釋下面的語法英鎊和百分號:語法與後殼參數名

i##*. 

    i%.* 

我明白它在做什麼,但我想知道的一般模式(爲什麼/它是如何這樣做)。在那裏它出現

代碼:

#!/bin/bash 

recursive_name_change() 
{ 
    cd "$1" 
    for i in * 
    do 
     #echo "${i##*.}" 
     if [ -d "$i" ] 
     then 
      recursive_name_change "$i" 
     elif [ "${i##*.}" = "cpp" ] 
     then 
      new_name=${i%.*}".c" 
     mv "$i" "$new_name" 
     fi 
     done 
     cd ../ 
    } 

recursive_name_change . 

有人請也建議,我在哪裏可以找到這些特殊的語法形式?

+3

你甚至*嘗試*閱讀bash手冊頁並搜索'##'? – ghoti

+0

不,我沒有在bash手冊中搜索它,但我確實執行了谷歌搜索,但沒有任何有用的結果。 –

+1

尋找「參數擴展」。 –

回答

2

看看man bash參數擴展

${parameter#word} 
    ${parameter##word} 

刪除匹配前綴模式。這個詞被擴展爲產生一個 的模式,如路徑名擴展。如果模式與參數 的值的開始位置相匹配,則擴展結果是參數 的擴展值,其中最短匹配模式(#)或最長匹配模式(##)被刪除。如果參數是@或*,則將依次對每個位置參數應用模式刪除操作 ,並將擴展結果作爲結果列表。如果參數是以@或*, 爲下標的數組變量,則將模式刪除操作依次應用於數組的每個成員, 並且展開是結果列表。

${parameter%word} 
    ${parameter%%word} 

刪除匹配的後綴模式。這個詞被擴展爲產生一個 的模式,如路徑名擴展。如果模式與參數 擴展值的尾部相匹配,則擴展結果是擴展的 參數值,其中最短匹配模式(%)或 最長匹配模式(%%)被刪除。如果參數是@或*, ,模式刪除操作依次應用於每個位置參數, 並且擴展是結果列表。如果參數是一個以@或*爲下標的數組變量 ,則模式移除操作將依次應用於數組的每個存儲單元,並且擴展是結果列表。

總之,#從左側刪除,%從右側的圖案,加倍符號使匹配貪婪。 (助記符:#位於大多數鍵盤上的%的左側)。在this manual

+1

's /大多數鍵盤/英文鍵盤/ g' – ceving

0

查找部分 「子字符串去除」:

${string##substring} 

刪除從$string$substring最長匹配。

${string%substring} 

刪除從$string$substring最短的匹配。

+1

ABS通常不是一個好資源。它忽略了許多警告。忽略最佳做法。包括質量差的代碼。等等。 –

+0

不過,它正確地解釋了什麼被問到:-) – cd1

+0

是的,但通過使用'echo $ {unquoted_variable}'這是一個不好的做法顯示。 –