Shell 程式設計/擴充套件
擴充套件是將值傳遞給指令碼所必需的。我們將在這裡討論算術擴充套件和引數擴充套件。在變數之前放置 '$' 將擴充套件其值。
算術擴充套件不是 可移植 shell 語法 的一部分,但作為 POSIX 擴充套件新增。算術擴充套件使用 $((operation)) 結構實現。引數擴充套件透過使用 ${parameter} 結構實現。
讓我們舉一個算術擴充套件的例子
one=1 $(($one+1))
$(($one+1)) 將具有值為 2。
讓我們嘗試對引數擴充套件進行一些示例。假設我們想從 'HelloBob' 中刪除字串 'Hello'。以下操作將實現此目的
string='HelloBob'
${string%Bob}
${string%Bob} 部分從變數 string 的末尾刪除 'Bob',因此我們剩下 Hello 作為輸出。
如果變數 string 的值為 'HelloBobBob',${string%%Bob*} 將執行相同的操作。'%%' 部分是必需的,因為它表示刪除與 'Bob*' 匹配的最長模式。所以,我們也剩下 'Hello'。
如果將 '%' 替換為 '#',將 '%%' 替換為 '##',則這表示相同的含義,但這次是從引數的開頭,而不是從結尾。例如,以下程式碼將從 'HelloBobBob' 中刪除 'Hello'
${string#Hello}
以下小節代表了一種處理情況的語法,其中變數可能未定義。
${param-value}
如果 param 的原始值為 null,則使用 'value',否則使用param 變數的值。
${param?value}
如果定義了 param,則使用 param,否則將 value 列印到輸出 - 它實際上中止了命令。
${param+value}
如果定義了 param,則使用 'value'(否則為空字串)。
${param=value}
如果 param 未定義,則使用 'value' 並將 param 設定為 'value'。
除了上述語法之外,還有一種在-/?/+/= 前面有冒號的語法,例如
${param:?Parameter param must be set and non-empty}
對於上述所有四個運算子,這會導致空變數與上述定義中未定義的變數以相同方式處理。