Bash:检查变量是否已声明(使用声明)

问题描述 投票:0回答:1

在设置失败的命令后,如何在 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,但我想避免不必要的字符串。

bash if-statement conditional-statements declare
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.