shell变量旁边的连字符是什么

use*_*168 2 bash shell scripting

我在一些脚本中看到有一个连接到shell变量的连字符.例如:

if [ -z ${X-} ]
Run Code Online (Sandbox Code Playgroud)

变量旁边的这个连字符符号在这里做什么.我在网上找不到任何相关文档.

gni*_*urf 5

这一切都在本手册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使用).