在 Bash 中重复使用 :-?

Redundant use of :- in Bash?

我在一个函数中有这段代码:

local var=""
local fileVar="${var}_FILE"
local def="${2:-}"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
    echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
    exit 1
fi

这里:-的作用是什么?不是多余的吗?具体来说,if语句不可以这样写吗?

if [ "${!var}" ] && [ "${!fileVar}" ]; then

:- 右侧有一个空“字”有什么帮助?

想通了。间接参数扩展中的 :- 构造可防止脚本在 运行 和 set -u 时失败。

这是一个例子:

set -u
var=x
[[ ${!var:-} ]] && echo This works
[[ ${!var} ]]   && echo This should fail
echo "This should print only when run without 'set -u'"

给出了这个输出:

line 6: !var: unbound variable

如果相同的语句 运行 没有 set -u,我们得到:

This should print only when run without 'set -u'

但是,如果我们使用直接参数扩展,这个技巧就不起作用了。所以,

set -u
[[ ${var:-} ]] && echo Does this work

仍然抛出错误:

tt.sh: line 6: var: unbound variable