跳轉到內容

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}

對於上述所有四個運算子,這會導致空變數與上述定義中未定義的變數以相同方式處理。

華夏公益教科書