在bash中使用: - (冒号)

pah*_*hko 55 syntax bash

这个风格在bash中是什么意思?

${PUBLIC_INTERFACE:-eth0}
Run Code Online (Sandbox Code Playgroud)

目的是:-什么?

Tim*_*ote 76

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

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

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

$ {parameter:= word}分配默认值.如果参数未设置或为null,则将字的扩展分配给参数.然后替换参数的值.不能以这种方式分配位置参数和特殊参数.

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

$ {parameter:+ word}使用替代值.如果参数为null或未设置,则不替换任何内容,否则将替换word的扩展.


Ben*_* W. 6

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

例:

$ str=
$ echo "${str:-default}"
default
Run Code Online (Sandbox Code Playgroud)

这和类似的扩展使用:=,:+以及:?所有有两种形式:有和没有一个冒号.不同的是,扩大结肠踢了"空或取消 ",而没有冒号,它只是"空".

注意:

$ str=                      # Null, but not unset
$ echo "${str-default}"     # Expands to value of $str, the empty string

$ echo "${str:-default}"    # Expands to "default"
default
Run Code Online (Sandbox Code Playgroud)

这在哪里有用?几个例子:

  • 默认值

    • 编辑最后一个命令的编辑器fc是扩展的结果${FCEDIT:-${EDITOR:-vi}}:$FCEDIT如果已定义,或者$EDITOR如果已定义,或者vi.
    • 脚本中的一个循环应该从文件读取(如果一个作为参数提供,并且来自标准输入,否则看起来像这样:

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

    set -u通过让脚本在遇到未设置的变量时死亡来强制清理脚本是一种方便的方法,例如本文所推崇的(不是我支持那里的所有内容1).如果我们想要检查某个变量是否具有值[[ $var ]],则脚本现在会在var未设置的情况下死亡,即使这可能是合法的.

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

顺便提一下,这些扩展并不是Bash独有的:POSIX shell规范也包含它们.


1另见BashFAQ/112,使用set -u(或set -o nounset)有哪些优缺点?