在现有的 shell 脚本中,我看到引用的一些变量包含减号或以减号结尾。例如:
PID=${PID-/run/unicorn.pid}
和:
run_by_init() {
([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}
在这两种情况下,减号代表什么意思?
答案1
根据 bash 手册页中“参数扩展”一节的内容,这意味着“如果参数未设置,则使用默认值”。例如,
${PID-/run/unicorn.pid}
如果设置了 $PID,则等于 $PID,否则等于 /run/unicorn.pid。
答案2
需要强调的是,这意味着取消设置变量。不能为空。
并与进行比较:-
,如果变量为,则将使用默认值(减号后面的值)未设置或为空(如空字符串)。
没有冒号的减号并不常见(至少我没见过),而且比:-
它更具体,甚至没有提到GNU 手册并不在我的man bash
,但它被描述为例子在 tldp 上。
当变量没有保存合理值时,需要替换默认值。后者更合适。
PID=${PID-/run/unicorn.pid}
PID 可能已被使用,但后来在脚本中使用 PID="" 清空。此关联将失败,PID 将保持为空字符串“”
PID=${PID:-/run/unicorn.pid}
如果未设置,PID 将变为“/run/unicorn.pid”,但即使之前它为空(“”),也是如此。
没有默认值的构造${previous-}
被认为是一种安全措施,可以防止有人set -u
设置 -u|名词设置
执行参数扩展时,将未设置的变量和特殊参数 '@' 或 '*' 以外的参数视为错误。错误消息将写入标准错误,并且非交互式 shell 将退出。
https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
set -u
[ "${previous}" ] || echo "This will fail"
[ "${previous-}" ] || echo "This works"