- brace ({}):
- tilde (~):目錄擴展
- $ parameter and variable 擴展、arithmetic 擴展、command substitution ($)
- word splitting:上面 ($) 類擴展如不在雙引號內,會依據 IFS 進行字切割。
- pathname
最後移除一開始就有的、未 quoted 的 quote 字元。
只有 brace expansion, word splitting, 及 pathname expansion 會改變字的數目,其它擴展擴展一個字為一個字,唯一的例外是 "$@" 及 "${name[@]}" 的擴展 (見 PARAMETERS).
Brace Expansion {}
{} 間一系列以「,」區隔的字串個別擴展為 word,或是兩個數字或兩個單一字元以「..」區隔的序列擴展 {x..y[..incr]}。序列擴展如果是數字的,前面可以加 0 來嘗試強迫產生相同位數的數字。數字或字元間的序列擴展預設的增減值是 1 或 -1,可以再加「..數字」設定增減值。{} 裡可以有 {} 進行巢狀擴展。
「${」不做 brace 擴展,以免跟 parameter 擴展衝突。
例如
- 「a{d,c,b}e」會擴展成「ade ace abe」
- mkdir /usr/local/src/bash/{old,new,dist,bugs}
- chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
Tilde Expansion ~
tilde-prefixParameter Expansion
$ 字元引入參數擴展、指令取代、或算術擴展。$參數 或 ${參數} 取代為變數值,參數名稱可用 {} 包起來避免跟緊接著的字元有錯誤連結。名稱是兩位以上數子,必須用 {} 包起來。
間接變數
下面 word 的部份會進行 tilde expansion、參數擴展、指令取代、和算術擴展。
- ${parameter:-word}
- 當 parameter unset 或 null 時,使用預設值 word。
- ${parameter:=word}
- 當 parameter unset 或 null 時,使用預設值 word 並指定給 parameter。位置參數和特殊參數不能用這種方式指定。
- ${parameter:?word}
- ${parameter:+word}
- ${parameter:offset}
- ${parameter:offset:length}
- ${!prefix*}
- ${!prefix@}
- ${!name[*]}
- ${!name[@]}
- ${#parameter}
- 參數長度
- ${parameter#word}
- 移除字串開頭最短符合 word 的部份。
- ${parameter##word}
- 移除字串開頭最長符合 word 的部份。
- ${parameter%word}
- 移除字串結尾最短符合 word 的部份。
- ${parameter%%word}
- 移除字串結尾最長符合 word 的部份。
- ${parameter/pattern/string}
- ${parameter//pattern/string}
- ${parameter/#pattern/string}
- ???
- ${parameter^pattern}
- ${parameter^^pattern}
- 轉換成大寫。
- ${parameter,pattern}
- ${parameter,,pattern}
- 轉換成小寫。
Command Substitution 指令取代
$(指令) 或 `指令`,取代為指令執行的輸出 (移除最後換行)。$(cat file) 可以用更快的 $(< file) 取代。
Arithmetic Expansion
$((expression))Process Substitution
Word Splitting 切割字
Pathname Expansion 路徑擴展
Pattern MatchingQuote Removal
移除所有非上述擴展產生的,unquoted 用的「\」、「'」、及「"」。參考
- man bash 的 EXPANSION 節
- http://godleon.blogspot.tw/2007/06/shell-script-linux-pipe.html
沒有留言:
張貼留言