bash中这种风格的含义是什么?
${PUBLIC_INTERFACE:-eth0}
:-
的目的是什么?
答案 0 :(得分:68)
如果$PUBLIC_INTERFACE
存在且不为null,则返回其值,否则返回"eth0"
。
bash man page中记录了其中的一些内容:
$ {parameter:-word} 使用默认值。如果参数未设置或为null,则替换单词的扩展。否则,参数的值将被替换。
$ {parameter:= word} 分配默认值。如果参数未设置或为null,则将字的扩展分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。
$ {参数:?word} 如果为空或未设置则显示错误。如果参数为null或未设置,则单词的扩展(或者如果单词不存在则为该效果的消息)将写入标准错误,并且如果shell不是交互式,则退出。否则,参数的值将被替换。
$ {parameter:+ word} 使用替代值。如果参数为null或未设置,则不替换任何内容,否则将替换word的扩展。
答案 1 :(得分:6)
:-
shell parameter expansion中使用 ${parameter:-word}
:如果 parameter
为null或未设置,则会扩展为的值word
,否则为 parameter
的值。
示例:
$ str=
$ echo "${str:-default}"
default
这个以及使用:=
,:+
和:?
的类似扩展都有两种形式:有和没有冒号。不同之处在于使用冒号进行“null 或取消设置”,而没有冒号,它只是“null”。
观察:
$ str= # Null, but not unset
$ echo "${str-default}" # Expands to value of $str, the empty string
$ echo "${str:-default}" # Expands to "default"
default
这在哪里有用?几个例子:
默认值
fc
调用编辑最后一个命令的编辑器是扩展${FCEDIT:-${EDITOR:-vi}}
的结果:$FCEDIT
(如果已定义),或者$EDITOR
(如果已定义),或者{ {1}}。脚本中应该从文件中读取的循环(如果一个作为参数提供,并且来自标准输入,否则可能如下所示:
vi
使用while IFS= read -r line; do
# do something
done < "${1:-/dev/stdin}"
set -u
是一种方便的方法,通过让脚本在遇到未设置的变量时死亡来强制执行更清晰的脚本,例如this article提升(不是我支持那里的所有内容 1 < / SUP>)。如果我们想要检查某个变量是否具有set -u
的值,那么如果[[ $var ]]
未设置,脚本现在就会死亡,即使这可能是合法的。
解决这个问题的方法是使用var
,而[[ ${var:-} ]]
不会抱怨。 (这基本上是再次使用默认值,但在这种情况下,替换值是空字符串。)
顺便说一句,这些扩展并不仅限于Bash:POSIX shell spec也包含所有这些扩展。
1 另见BashFAQ/112, What are the advantages and disadvantages of using set -u
(or set -o nounset
)?