Linux Shell編程之參數和變量擴展
linux shell參數擴展
${param}
拓展變量的值,以及防止變量被錯誤解析,比如:${hello}world、${arr[1]}
${arr[*]} 或 ${arr[@]}:返回數組 arr 的所有元素
${!param}
bash 2 中可以使用 ${!param} 來進行間接引用,比如 ${!#} 返回最後一個位置參數
${!arr[*]} 或 ${!arr[@]}:返回數組 arr 的所有下標
刪除匹配子串
${param#pattern}:從 param 開頭刪除 pattern 匹配的子串(最小匹配)
${param#pattern}:從 param 開頭刪除 pattern 匹配的子串(最大匹配)
${param%pattern}:從 param 結尾刪除 pattern 匹配的子串(最小匹配)
${param%%pattern}:從 param 結尾刪除 pattern 匹配的子串(最大匹配)
提取子串
${param:offset}:提取 param 中從位置 offset 開始的子串(offset 從 0 開始)。如果 offset 為負數,表示從字符串結尾開始,此時 offset 必須被括號括起來,或者在 offset 之前加一個空格
${param:offset:length}:提取 param 中從 offset 開始的長度為 length 的子串,其他同上
param 可以為 * 或 @,表示對位置參數進行分片操作,比如 ${@:3:2} 返回從第 3 個位置參數開始的 2 個位置參數
根據變量狀態賦值
${var-string}:若 var 未定義,則返回 string,否則返回 var 的值
${var:-string}:若 var 未定義或為空,則返回 string,否則返回 var 的值
${var=string}:若 var 未定義,則將 string 賦給 var,然後返回 var 的值,否則直接返回 var 的值
${var:=string}:若 var 未定義或為空,則將 string 賦給 var,然後返回 var 的值,否則直接返回 var 的值
${var+string}:若 var 已定義,則返回 string,否則返回 var 的值
${var:+string}:若 var 為非空,則返回 string,否則返回 var 的值
${var?string}:若 var 未定義,則將 string 輸出到標准錯誤,並退出腳本,否則返回 var 的值
${var:?string}:若 var 未定義或為空,則將 string 輸出到標准錯誤,並退出腳本,否則返回 var 的值
模式替換
${param/pattern/string}:將 param 中第一個匹配 pattern 的子串替換為 string
${param//pattern/string}:將 param 中所有匹配 pattern 的子串替換為 string
${param/#pattern/string}:如果 param 開頭匹配 pattern,則將開頭替換為 string
${param/%pattern/string}:如果 param 結尾匹配 pattern,則將結尾替換為 string
如果 param 是 @ 或 *,表示對所有的位置參數進行模式替換
如果 param 為 arr[@] 或 arr[*],則表示對數組中所有的元素進行模式替換
變量長度和個數
${#param}:返回 param 值的長度
${#*} 和 ${#@}:返回位置參數的個數
${arr[*]} 和 ${arr[@]}:返回數組 arr 的元素個數
變量大小寫轉換
${param^pattern}:pattern 為單個字符,將 param 中第一個匹配 pattern 的字符轉換為大寫
${param^^pattern}:pattern 為單個字符,將 param 中所有匹配 pattern 的字符轉換為大寫
${param,pattern}:pattern 為單個字符,將 param 中第一個匹配 pattern 的字符轉換為小寫
${param,,pattern}:pattern 為單個字符,將 param 中所有匹配 pattern 的字符轉換為小寫
param 可以為 * 或 @ 或 arr[*] 或 arr[@]
如果 pattern 為空,則將其視為 ?,表示匹配任意字符