shell 脚本美元括号内的减号是什么意思?

shell 脚本美元括号内的减号是什么意思?

在现有的 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"

相关内容