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