Munging 在擴張期間

變數不一定必須擴充套件到它們的值 - 可以在擴充套件期間提取子字串,這對於提取副檔名或路徑的一部分很有用。全域性字元保持其通常的含義,因此 .*指的是字面點,後跟任何字元序列; 這不是一個正規表示式。

$ v=foo-bar-baz
$ echo ${v%%-*}
foo
$ echo ${v%-*}
foo-bar
$ echo ${v##*-}
baz
$ echo ${v#*-}
bar-baz

也可以使用預設值擴充套件變數 - 比方說我想呼叫使用者的編輯器,但如果他們沒有設定,我想給他們 vim

$ EDITOR=nano
$ ${EDITOR:-vim} /tmp/some_file
# opens nano
$ unset EDITOR
$ $ ${EDITOR:-vim} /tmp/some_file
# opens vim

執行此擴充套件有兩種不同的方式,不同之處在於相關變數是空還是未設定。如果變數未設定或為空,則使用:- 將使用預設值,而如果變數未設定,則 - 僅使用預設值,但如果設定為空字串,則使用變數:

$ a="set"
$ b=""
$ unset c
$ echo ${a:-default_a} ${b:-default_b} ${c:-default_c}
set default_b default_c
$ echo ${a-default_a} ${b-default_b} ${c-default_c}
set default_c

與預設值類似,可以給出替代方案; 如果特定變數不可用,則使用預設值,如果變數可用,則使用替代值。

$ a="set"
$ b=""
$ echo ${a:+alternative_a} ${b:+alternative_b}
alternative_a

注意到這些擴充套件可以巢狀,在向命令列標誌提供引數時,使用替代方法變得特別有用;

$ output_file=/tmp/foo
$ wget ${output_file:+"-o ${output_file}"} www.stackexchange.com
# expands to wget -o /tmp/foo www.stackexchange.com
$ unset output_file
$ wget ${output_file:+"-o ${output_file}"} www.stackexchange.com
# expands to wget  www.stackexchange.com