2018年10月6日 星期六

bash EXPANSION

bash 指令行切成字後會進行7 種擴展,依下列順序:
  1. brace ({}):
  2. tilde (~):目錄擴展
  3. $ parameter and variable 擴展、arithmetic 擴展、command substitution ($)
  4. word splitting:上面 ($) 類擴展如不在雙引號內,會依據 IFS 進行字切割。
  5. pathname
有些系統還支援額外的 process substitution,在上述順序 2 和 3 同時進行。

最後移除一開始就有的、未 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}}
傳統的 sh 沒有 Brace 擴展,要停用 Brace 擴展可以使用 +B 選項。

Tilde Expansion ~

tilde-prefix

Parameter 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 Matching

Quote Removal

移除所有非上述擴展產生的,unquoted 用的「\」、「'」、及「"」。

參考

  1. man bash 的 EXPANSION 節
  2. http://godleon.blogspot.tw/2007/06/shell-script-linux-pipe.html

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...