use*_*168 2 bash shell scripting
我在一些脚本中看到有一个连接到shell变量的连字符.例如:
if [ -z ${X-} ]
Run Code Online (Sandbox Code Playgroud)
变量旁边的这个连字符符号在这里做什么.我在网上找不到任何相关文档.
这一切都在本手册的Shell参数扩展部分中进行了解释:
${parameter:-word}如果
parameter未设置或为null,word则替换扩展.否则,值parameter被替换.
就在此之前,有:
省略冒号只会导致对未设置的参数进行测试.
所以:
${X-stuff}
Run Code Online (Sandbox Code Playgroud)
扩展为:
$Xif 的扩展X已设置stuff如果X没有设置.试试吧:
$ unset X
$ echo "${X-stuff}"
stuff
$ X=
$ echo "${X-stuff}"
$ X=hello
$ echo "${X-stuff}"
hello
$
Run Code Online (Sandbox Code Playgroud)
现在你的扩张是
${X-}
Run Code Online (Sandbox Code Playgroud)
所以你猜它扩展到$Xif X的设置扩展,如果没有设置则扩展为空字符串X.
你为什么想做这个?对我来说,似乎这是一个解决方法set -u:
$ set -u
$ unset X
$ echo "$X"
bash: X: unbound variable
$ echo "${X-}"
$
Run Code Online (Sandbox Code Playgroud)
最后,你的考试
if [ -z "${X-}" ]
Run Code Online (Sandbox Code Playgroud)
(注意引号,它们是必需的)测试是否X为零(无论X是否设置,即使set -u使用).