bash中:-(冒号)的用法


70

bash中此样式的含义是什么?

${PUBLIC_INTERFACE:-eth0}

目的是:-什么?

Answers:


97

如果$PUBLIC_INTERFACE存在并且不为null,则返回其值,否则返回"eth0"

bash手册页中实际上记录了其中一些:

$ {parameter:-word}使用默认值。如果参数未设置或为null,则替换单词的扩展名。否则,将替换参数的值。

$ {parameter:= word}分配默认值。如果参数未设置或为空,则将单词扩展指定给参数。然后替换参数的值。不能以此方式分配位置参数和特殊参数。

$ {parameter:?word}如果为Null或未设置,则显示错误。如果parameter为null或未设置,则将单词扩展(如果不存在单词则显示一条消息)写入标准错误,并且如果外壳不是交互式的,则退出shell。否则,将替换参数的值。

$ {parameter:+ word}使用备用值。如果parameter为null或未设置,则不替换任何内容,否则替换word的扩展名。


9

:-shell参数扩展中使用:如果为null或未设置,则扩展为的值,否则扩展为的值。${parameter:-word} parameterwordparameter

例:

$ 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
    • 脚本中的一个循环应从文件中读取(如果将其作为参数提供),否则应从标准输入中读取,如下所示:

      while IFS= read -r line; do
          # do something
      done < "${1:-/dev/stdin}"
      
  • 使用时 set -u

    set -u这是一种方便的方法,可以通过使脚本在遇到未设置的变量时死掉来强制执行更干净的脚本,例如,如本文所倡导的那样(不是我认可其中的所有内容1)。如果我们要检查某个变量的值是否为[[ $var ]],则脚本会死掉,如果var未设置,即使这可能是合法的。

    解决此问题的方法是[[ ${var:-} ]]改用,并且set -u不会抱怨。(这基本上是再次使用默认值,但是在这种情况下,替换值是空字符串。)

顺便说一下,这些扩展并不是Bash独有的:POSIX shell规范也包含了所有这些扩展。


1另请参见BashFAQ / 112,使用set -u(或set -o nounset)的优点和缺点是什么?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.