请解释一下这个 BASH 代码(一行)

请解释一下这个 BASH 代码(一行)

以前从未在 BASH 中看到过这样的用法:

pidfile=${PIDFILE-/var/run/service.pid}

我以前从未见过/使用过的部分就是该${PIDFILE-部分。

答案1

意思是$PIDFILE如果$PIDFILE已定义则使用,/var/run/service.pid如果$PIDFILE未定义则使用。

从新 shell 开始:

$ echo ${PIDFILE-/var/run/service.pid}
/var/run/service.pid

现在定义PIDFILE:

$ PIDFILE=/var/run/myprogram.pid
$ echo ${PIDFILE-/var/run/service.pid}
/var/run/myprogram.pid

这是 Bourne Shell 的旧作sh 手册页

   ${parameter-word}
          If parameter is set then substitute its value;
          otherwise substitute word.

您可能已经见过的另一种形式是${parameter:-word}。它类似,但如果parameter设置为空字符串,则行为会有所不同。

   ${parameter:-word}
          Use Default Values.  If parameter is unset or null,
          the expansion of word is substituted.  Otherwise,
          the value of parameter is substituted.

展示:

$ set | grep NOSUCHVAR    # produces no output because NOSUCHVAR is not defined
$ echo ${NOSUCHVAR-default}
default
$ echo ${NOSUCHVAR:-default}
default

$ NULLVAR=
$ set | grep NULLVAR      # produces output because NULLVAR is defined
NULLVAR=
$ echo ${NULLVAR-default}

$ echo ${NULLVAR:-default}
default

注意如何${NULLVAR-default}扩展为空字符串,因为NULLVAR 已定义。

要获得完整解释,请运行“man bash”并搜索参数扩展通过输入“/Parameter Expansion”。

${parameter-word} 位隐藏在此解释中:

    When  not  performing  substring  expansion, using the forms documented below,
    bash tests for a parameter that is unset or null.  Omitting the colon results
    in a test only for a parameter that is unset.

感谢 Dennis 对 set 与 null 的修正。

答案2

米克尔:

难道不应该按照 pidfile=${PIDFILE:-/var/run/service.pid}你的方式来解释吗?

相关内容