在运行脚本之前,我需要测试是否设置了某些环境变量。我正在从这个答案中使用一种技术:
if [ -z ${var1+x} ]
echo "var1 not set"
exit 1
fi
这对于字符串变量很有效,但是有一个参数需要为数组。它必须设置,但可以为空。
foo=("foo" "bar" "baz")
[ -z ${foo+x} ] # false
bar=()
[ -z ${bar+x} ] # true
[ -z ${baz+x} ] # also true
因此,我的问题是如何声明一个空数组,以使其与未设置的变量区分开。我还想测试变量是数组(无论是否为空)或非数组(无论是设置还是未设置)。
或使用此方法
[[ ${var[@]@A} =~ '-a' ]] && echo array || echo variable
基于此
$ man bash
...
${parameter@operator}
Parameter transformation. The expansion is either a transformation of the value of parameter or information about parameter itself, depending
on the value of operator. Each operator is a single letter:
Q The expansion is a string that is the value of parameter quoted in a format that can be reused as input.
E The expansion is a string that is the value of parameter with backslash escape sequences expanded as with the $'...' quoting mechansim.
P The expansion is a string that is the result of expanding the value of parameter as if it were a prompt string (see PROMPTING below).
A The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with
its attributes and value.
a The expansion is a string consisting of flag values representing parameter's attributes.
If parameter is @ or *, the operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter
is an array variable subscripted with @ or *, the case modification operation is applied to each member of the array in turn, and the expan‐
sion is the resultant list.
The result of the expansion is subject to word splitting and pathname expansion as described below.
...