Shell参数展开中末尾短横线(${VAR-})的作用是什么?
Bash参数扩展中末尾短横线的作用
这是Bash里的参数默认值替换语法简化形式,核心作用是提升脚本在严格模式下的健壮性,具体差异如下:
当使用
${ENV_OVERRIDE-}时:
不管环境变量ENV_OVERRIDE是未定义,还是已定义但为空值,这个表达式都会展开成空字符串,而且不会触发任何错误。哪怕你开启了Shell的严格模式(set -u,该模式下引用未定义变量会直接报错终止脚本),脚本也能正常执行。当直接写
${ENV_OVERRIDE}时:
如果没开set -u,两种写法表现确实一致;但一旦开启严格模式,只要ENV_OVERRIDE未被定义,脚本会立刻抛出bash: ENV_OVERRIDE: unbound variable的错误并终止,根本走不到后续逻辑。
举个实际测试例子:
开启严格模式后,带短横线的脚本能正常跑完:
set -u if [[ ! -z "${ENV_OVERRIDE-}" ]]; then CFG="some/path/$ENV_OVERRIDE.conf" fi echo "脚本执行完成"
而不带短横线的脚本会直接报错:
set -u if [[ ! -z "${ENV_OVERRIDE}" ]]; then CFG="some/path/$ENV_OVERRIDE.conf" fi echo "脚本执行完成"
简单说,这个短横线就是给变量加了个“容错兜底”:就算变量没定义,也不会搞崩脚本,尤其适合需要兼容严格模式的场景。
内容的提问来源于stack exchange,提问作者codeforester
相关产品推荐
相关产品推荐

