參數展開

Parameter Expansion

喺 Bash 入面,參數展開係一種用嚟操作同處理變量內容嘅機制。 通過參數展開,可以攞變量嘅值,修改變量嘅值,或者為未設置嘅變量提供默認值。

Shell Parameter Expansion

Shell 參數展開

變量展開

最常見嘅方式。

var="Bash"
echo "Hello, ${var}!"

默認值展開

標記 +

${var+DEFAULT}
  • var 未定義:返回空串。
  • var 已定義:
    • 係空值:返回 DEFAULT。
    • 非空值:返回 DEFAULT。
unset var
echo ${var+foo}
 

var=
echo ${var+foo}
foo

可以用呢個標記嚟判斷變量係咪未定義。

#!/usr/bin/env bash

if [ -n "${var+defined}" ]; then
    echo "var already defined"
else
    echo "var not defined"
fi

注意

如果 ${var+defined} 冇用雙引號,當返回空字符串嘅時候,條件就會變成 [ -n ] , 呢個係一個有效嘅條件,唔會產生任何錯誤,且佢嘅返回值為真。顯然呢個係唔合理嘅,所以必須加雙引號。

標記 -

${var-DEFAULT}
  • var 未定義:返回 DEFAULT。
  • var 已定義:
    • 係空值:返回 var。
    • 非空值:返回 var。
unset var
echo ${var-foo}
foo

var=
echo ${var-foo}
 

var 同 DEFAULT 嘅值有可能相同,所以唔可以用嚟判斷 var 係咪被定義。

標記 :+

${var:+DEFAULT}
  • var 未定義:返回空串。
  • var 已定義:
    • 係空值:返回空串。
    • 非空值:返回 DEFAULT。
var=abc
echo ${var:+foo}
foo

標記 :-

${var:-DEFAULT}
  • var 未定義:返回 DEFAULT。
  • var 已定義
    • 係空值:返回 DEFAULT。
    • 非空值:返回 var。
unset var
echo ${var:-foo}
var=
echo ${var:-foo}

上面嘅兩個例子都會輸出 foo。

標記 :=

  • var 未定義:var=foo,返回 var。
  • var 已定義
    • 係空值:var=foo,返回 var。
    • 非空值:返回 var。
unset var
echo ${var:=foo}
echo $var
foo
foo

字符串操作

提取子串

var="heybro!"
echo ${var:3:4}
bro!

字符串長度

var="heybro!"
echo ${#var}
7

刪除前綴

刪除最短匹配:用 #,模式 */

var="a/b/c"
echo ${var#*/}
b/c

刪除最長匹配:用 ##,模式 */

var="a/b/c"
echo ${var##*/}
c

刪除後綴

刪除最短匹配:用 %,模式 /*

var="a/b/c"
echo ${var%/*}
a/b

刪除最長匹配:用 %%,模式 /*

var="a/b/c"
echo ${var%%/*}
a

替換第一個子串

var="aa bb aa"
echo ${var/aa/cc}
cc bb aa

替換所有子串

var="aa bb aa"
echo ${var//aa/cc}
cc bb cc