在 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
我在一个函数中有这段代码:
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