我已经看到一些shell脚本使用了这个变量引用表示法,我只是找不到任何信息。
就我的测试而言,它显然是一样的。
任何线索?
$ uno=1
$ if [ -n "${uno}" ]; then echo yay\! ; fi
yay!
$ if [ -n "${uno-}" ]; then echo yay\! ; fi
yay!
答案 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。