用法: – (冒号破折号)在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)的优缺点是什么?