这种风格在bash中的含义是什么?
${PUBLIC_INTERFACE:-eth0}
目的是:-
什么?
如果$PUBLIC_INTERFACE
存在且不为 null,则返回其值,否则返回"eth0"
。
实际上,bash 手册页中记录了其中一些:
${parameter:-word}使用默认值。如果参数未设置或为空,则替换单词的扩展。否则,参数的值被替换。
${parameter:=word}分配默认值。如果参数未设置或为空,则将单词的扩展分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。
${parameter:?word}如果为 Null 或未设置,则显示错误。如果 parameter 为 null 或未设置,则 word 的扩展(或如果 word 不存在,则将显示消息)写入标准错误,并且 shell,如果它不是交互式的,则退出。否则,参数的值被替换。
${parameter:+word}使用备用值。如果 parameter 为 null 或未设置,则不替换任何内容,否则替换 word 的扩展。
:-
用于shell 参数扩展:如果为 null 或未设置,则扩展为 的值,否则扩展为 的值。${parameter:-word}
parameter
word
parameter
例子:
$ str=
$ echo "${str:-default}"
default
这个和使用:=
,:+
的类似扩展:?
都有两种风格:带和不带冒号。不同之处在于,带有冒号的扩展用于“未设置或空”,而没有冒号,它只是“未设置”。
观察:
$ 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
。
脚本中的循环如果作为参数提供,则应从文件读取,否则从标准输入读取,可能如下所示:
while IFS= read -r line; do
# do something
done < "${1:-/dev/stdin}"
使用时set -u
set -u
是一种通过在遇到未设置的变量时终止脚本来强制执行更简洁的脚本编写的便捷方法,例如本文所提倡的(不是我赞同其中的所有内容1)。如果我们想检查某个变量是否具有 的值[[ $var ]]
,如果未设置,脚本现在就会var
终止,即使这可能是合法的。
解决这个问题的方法是使用[[ ${var:-} ]]
,并且set -u
不会抱怨。(这基本上是再次使用默认值,但在这种情况下替换的值是空字符串。2)
顺便说一下,这些扩展并不是 Bash 独有的:POSIX shell 规范也拥有它们。
1另请参阅BashFAQ/112,使用(或)的优点和缺点是什么?set -u
set -o nounset
2只是${var-}
代替${var:-}
实际上就足够了:set -u
不关心已设置但包含空字符串的变量;只有未设置的会触发错误。