用法: – (冒号破折号)在bash中
这种风格在bash中的含义是什么?
${PUBLIC_INTERFACE:-eth0}
什么是目的:-
?
如果$PUBLIC_INTERFACE
存在且不为空,则返回其值,否则返回"eth0"
。
其实有一些在bash手册页中有logging :
$ {parameter:-word}使用默认值。 如果参数未设置或为空,则replace单词的扩展名。 否则,参数的值被replace。
$ {parameter:= word}分配默认值。 如果参数未设置或为空,则将单词的扩展分配给参数。 参数的值将被replace。 位置参数和特殊参数不能以这种方式分配。
$ {parameter:?word}如果Null或Unset显示错误。 如果参数为空或未设置,则将单词(如果不存在单词的情况下的消息扩展)写入标准错误,并且shell(如果不是交互式)将退出。 否则,参数的值被replace。
$ {parameter:+ word}使用替代值。 如果参数为空或未设置,则不replace任何内容,否则replace扩展。
:-
用于${ parameter :- word }
shell参数扩展 :如果parameter
为null或unset,则展开为word
的值,否则展开为parameter
的值。
例:
$ str= $ echo "${str:-default}" default
这和类似的扩展使用:=
, :+
和:?
都有两种口味:有和没有冒号。 不同之处在于用冒号进行扩展时 ,为“null” 或“unset ”,而没有冒号时,只是“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
如果已定义),或者vi
。 -
应该从文件读取的脚本中的循环(如果提供了参数和标准input),否则可能如下所示:
while IFS= read -r line; do # do something done < "${1:-/dev/stdin}"
- 被调用编辑最后一个命令的编辑器是
-
使用
set -u
set -u
是一个非常方便的方法,通过脚本在遇到未设置的variables时死亡,例如本文所提倡的那样(不是我支持这里的所有内容)。 如果我们想检查某个variables是否有[[ $var ]]
,那么脚本现在会死亡,如果var
未设置,即使这可能是合法的。解决这个问题的方法是使用
[[ ${var:-} ]]
,set -u
不会抱怨。 (这基本上是再次使用默认值,但在这种情况下replace值是空string。)
顺便说一下,这些扩展并不是Bash所独有的: POSIX shell规范也包含了它们。
1另见BashFAQ / 112,使用set -u(或set -o nounset)的优缺点是什么?