在bash中使用:-(冒号破折号)

在bash中使用:-(冒号破折号),bash,syntax,Bash,Syntax,这种风格在bash中的含义是什么 ${PUBLIC_INTERFACE:-eth0} :-的用途是什么?如果$PUBLIC\u INTERFACE存在且不为空,则返回其值,否则返回“eth0” 实际上,以下文件中记录了其中的一些: ${parameter:-word}使用默认值。如果参数为unset或null,则替换word的展开形式。否则,将替换参数的值 ${parameter:=word}指定默认值。如果参数未设置或为空,则word的展开式将指定给参数。然后替换参数的值。位置参数和特殊参数

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

${PUBLIC_INTERFACE:-eth0}

:-
的用途是什么?

如果
$PUBLIC\u INTERFACE
存在且不为空,则返回其值,否则返回
“eth0”

实际上,以下文件中记录了其中的一些:

${parameter:-word}使用默认值。如果参数为unset或null,则替换word的展开形式。否则,将替换参数的值

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

${参数:?word}如果为空或未设置,则显示错误。如果参数为null或unset,则word的扩展(如果word不存在,则会显示相应的消息)将写入标准错误,如果shell不是交互式的,则退出。否则,将替换参数的值

${参数:+word}使用备用值。如果参数为null或unset,则不替换任何内容,否则替换word的展开形式


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

例如:

$ 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
这在哪里有用?举几个例子:

  • 默认值

    • 为编辑最后一个命令而调用的编辑器是展开的结果
      ${FCEDIT:-${editor:-vi}
      $FCEDIT
      如果已定义且不为空,或者
      $editor
      如果已定义且不为空,或者
      vi

    • 脚本中的循环,如果作为参数提供,则应从文件读取,否则从标准输入读取,可能如下所示:

      而IFS=read-r行;做
      #做点什么
      完成<“${1:-/dev/stdin}”
      
  • 使用
    设置-u时

    set-u
    是一种方便的方法,可以强制执行更干净的脚本编写,方法是在遇到未设置的变量时让脚本死亡,例如(我并不支持其中的所有内容1)。如果我们想检查某个变量是否有一个
    [[$var]]
    值,那么如果
    var
    未设置,脚本现在将终止,即使这可能是合法的

    解决方法是使用
    [[${var:-}]]
    ,而
    set-u
    不会抱怨。(这基本上是再次使用默认值,但在本例中,替换的值是空字符串。)

顺便说一句,这些扩展并不是Bash独有的:Bash也拥有它们


1另见