Bash 在扩张期间蒙混

示例

变量不一定必须扩展为其值-可以在扩展过程中提取子字符串,这对于提取文件扩展名或路径的一部分很有用。球形字符保留其通常的含义,因此.*指的是文字点,后跟任何字符序列;它不是正则表达式。

$ 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