在设置失败的命令后,如何在 Bash (5.x) 中检查变量是否已声明。
例如:
应该输出
No fail
,因为未声明 FAIL:
echo "Test" || declare -r FAIL
if [ -v FAIL ]; then echo "Fail"; else echo "No fail"; fi;
应该输出
Fail
,因为声明了 FAIL:
some_command_not_existing || declare -r FAIL
if [ -v FAIL ]; then echo "Fail"; else echo "No fail"; fi;
但是这并没有按预期工作。我也尝试过
-z
但这也不起作用。
我可以设置 FAIL=true,但我想避免不必要的字符串。
declare
可以告诉您变量是否已声明。
首先,查看设置和
-v
$ FAIL=
$ [[ -v FAIL ]] && echo set || echo not set
set
$ unset FAIL
$ [[ -v FAIL ]] && echo set || echo not set
not set
我们知道的就这么多。
现在,声明但未设置的变量怎么样?
$ declare -i FAIL
$ [[ -v FAIL ]] && echo set || echo not set
not set
$ declare -p FAIL && echo declared || echo not declared
declare -i FAIL
declared
$ unset FAIL
$ declare -p FAIL && echo declared || echo not declared
bash: declare: FAIL: not found
not declared
并且,删除
declare
的输出
$ unset FAIL
$ declare -p FAIL >/dev/null 2>&1 && echo declared || echo not declared
not declared
$ declare -i FAIL
$ declare -p FAIL >/dev/null 2>&1 && echo declared || echo not declared
declared
如果你希望一个变量设置为非空变量就OK,而任何其他情况都不OK,你可以使用
-n
$ unset FAIL
$ [[ -n $FAIL ]] && echo ok || echo not ok
not ok
$ FAIL=
$ [[ -n $FAIL ]] && echo ok || echo not ok
not ok
$ FAIL=foo
$ [[ -n $FAIL ]] && echo ok || echo not ok
ok
set -u
发生冲突。为此,您可以使用参数扩展。
$ unset FAIL
$ set -u
$ [[ -n $FAIL ]] && echo ok || echo not ok
bash: FAIL: unbound variable
$ [[ -n ${FAIL+""} ]] && echo ok || echo not ok
not ok
请注意,双括号条件对于未加引号的变量更加宽容。对于单括号条件,引用它:
$ [ -n ${FAIL+""} ] && echo ok || echo not ok # NOT the result you want
ok
$ [[ -n "${FAIL+""}" ]] && echo ok || echo not ok
not ok