2012-03-04 71 views
12

我回顧我的一些舊的代碼和跨越這句法來了,但我忘了到底是什麼意思:-)

extractDir="${downloadFileName%.*}-tmp" 

,我發現搜索的唯一信息是指命令的列表,但是這僅僅是一個變量。 這個花括號語法在bash中是什麼意思?

+3

從*綜合* [BASH參考手冊](http://www.gnu.org/software/bash/manual/bashref.html)開始......它包含在[參數擴展](http:///www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion)。 (花括號的意思是當* *之前有''''符號時)。 – 2012-03-04 21:41:20

回答

20

在這種情況下,它是一個parameter substitution

${variable%.*}裝置採取的$variable值,從該值的尾剝去圖案.*(助記符:百分比具有在尾一個「T」),並給出了結果。 (與此相反,${variable#xyz}指該變量的值的標頭中去除xyz,因爲(助記符)哈希具有在頭部爲「H」。)

鑑於:

downloadFileName=abc.tar.gz 
extractDir=abc.tar-tmp 

替代符號:

extractDir=${downloadFileName%%.*} 

產生

abc-tmp 

%%意味着刪除最長的尾巴;相應地,##表示刪除最長的匹配頭。

+0

謝謝你的徹底答案! – 2012-03-04 21:50:28

+0

@Shane:你確定嗎?在Bash?我在Mac OS X 10.10上幾乎完全打補丁的Bash 4.3(4.3.27(2))不喜歡它:'downloadFileName = abc.tar.gz; echo $ {$ {downloadFileName#abc。}%。gz}'generate:'bash-4.3:$ {$ {downloadFileName#abc。}%。gz}:bad substitution'。你能指定哪個平臺和哪個版本的Bash? – 2014-10-27 02:19:25

+0

在Zsh(** not Bash **)中,這些也可以嵌套(即$ {$ {downloadFilename#abc。}%。gz}得到「tar」)。感謝@JonathanLeffler的捕獲。 – Shane 2014-10-27 23:58:37

0

它用於展開一個環境變量,該環境變量與一些不是變量的文本相鄰,所以shell不包含變量名中的全部內容。