$ {var}和$ {var-}之间的区别是什么?

时间:2016-05-18 17:00:54

标签: bash

我已经看到一些shell脚本使用了这个变量引用表示法,我只是找不到任何信息。

就我的测试而言,它显然是一样的。

任何线索?

$ uno=1
$ if [ -n "${uno}" ]; then echo yay\! ; fi
yay!
$ if [ -n "${uno-}" ]; then echo yay\! ; fi
yay!

2 个答案:

答案 0 :(得分:5)

${uno-}是在未设置参数uno的情况下提供默认值的示例。

如果未设置uno,我们会获得-后面的字符串:

$ unset uno
$ echo ${uno-something}
something

如果uno仅为空字符串,则返回uno的值:

$ uno=""
$ echo ${uno-something}

$

如果uno具有非空值,当然会返回该值:

$ uno=Yes
$ echo ${uno-something}
Yes

为什么要使用${variable-}

如果脚本的正确操作很重要,脚本编写者通常会使用set -u,它会在使用unset变量时生成错误消息。例如:

$ set -u
$ unset uno
$ echo ${uno}
bash: uno: unbound variable

要处理可能要禁止显示此消息的特殊情况,可以使用尾随-

$ echo ${uno-}

$ 

[感谢发现OP full code使用set -u及其对此问题的重要性归Benjamin W所有。“

文档

来自man bash

  

当不执行子字符串扩展时,使用记录的表单   下面(例如:-),bash测试未设置或null的参数。   省略冒号会导致仅对参数进行测试   未设置。

  $ {parameter:-word}
使用默认值。如果参数未设置或为null,则替换单词的扩展。否则,价值   参数被替换。 [强调补充]

答案 1 :(得分:3)

在Bash手册中,关于parameter expansion

  

${parameter:-word}

     

如果参数未设置或为null,则替换 word 的扩展。否则,参数的值将被替换。

在您的情况下,word是空字符串,省略冒号。如果没有冒号,则检查仅用于取消设置,但不用于null,因此${uno-}等同于检查是否设置了uno(请参阅How to check if a variable is set in Bash?),如果不是,请展开它是空字符串 - 保证扩展不被设置。

这取决于具体情况;在你的例子中,它确实没有区别。

原来上下文是使用set -u的脚本 - 有关详细信息,请参阅John 1024's answer