在bash中使用: - (冒号)

时间:2012-04-30 20:51:02

标签: bash syntax

bash中这种风格的含义是什么?

${PUBLIC_INTERFACE:-eth0}

:-的目的是什么?

2 个答案:

答案 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)?