以前从未在 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}
你的方式来解释吗?