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