如何测试是否在Bash中声明了关联数组?我可以测试一个变量,如:
[ -z $FOO ] && echo nope
但我似乎不适用于关联数组:
$unset FOO
$declare -A FOO
$[ -z $FOO ] && echo nope
nope
$FOO=([1]=foo)
$ [ -z $FOO ] && echo nope
nope
$ echo ${FOO[@]}
foo
修改
感谢您的回答,两者似乎都有效,所以我让速度决定:
$ cat test1.sh
#!/bin/bash
for i in {1..100000}; do
size=${#array[@]}
[ "$size" -lt 1 ] && :
done
$ time bash test1.sh #best of five
real 0m1.377s
user 0m1.357s
sys 0m0.020s
和另一个:
$ cat test2.sh
#!/bin/bash
for i in {1..100000}; do
declare -p FOO >/dev/null 2>&1 && :
done
$ time bash test2.sh #again, the best of five
real 0m2.214s
user 0m1.587s
sys 0m0.617s
编辑2:
让我们快速比较Chepner的解决方案与之前的解决方案:
#!/bin/bash
for i in {1..100000}; do
[[ -v FOO[@] ]] && :
done
$ time bash test3.sh #again, the best of five
real 0m0.409s
user 0m0.383s
sys 0m0.023s
那很快。
再次感谢,伙计们。
答案 0 :(得分:10)
在bash
4.2或更高版本中,您可以使用-v
选项:
[[ -v FOO[@] ]] && echo "FOO set"
请注意,在任何版本中,请使用
declare -A FOO
实际上并不会立即创建关联数组;它只是在名称FOO
上设置一个属性,允许您将名称指定为关联数组。在第一次分配之前,数组本身不存在。
答案 1 :(得分:8)
您可以使用declare -p
检查是否已声明变量:
declare -p FOO >/dev/null 2>&1 && echo "exists" || echo "nope"
并特别检查关联数组:
[[ "$(declare -p FOO 2>/dev/null)" == "declare -A"* ]] &&
echo "array exists" || echo "nope"
答案 2 :(得分:2)
最简单的方法之一是检查数组的大小:
size=${#array[@]}
[ "$size" -lt 1 ] && echo "array is empty or undeclared"
您可以在命令行上轻松测试:
$ declare -A ar=( [key1]=val1 [key2]=val2 ); echo "szar: ${#ar[@]}"
szar: 2
此方法允许您测试数组是否已声明,并且是否为空或未声明。空数组和未声明的数组都将返回0
大小。
答案 3 :(得分:1)
这是 an excellent answer 的社区 Wiki 版本,由 @user15483624 撰写,该问题现已作为重复项关闭。如果该用户选择在此处添加他们自己的答案,则应将其删除,以支持带有他们名字的答案。
仅当需要与 bash 4.x 和先前版本兼容时,才应使用有关此问题的先前答案。在 bash 5.0 及更高版本中,可以直接使用扩展来检查变量类型;它的使用比解析 declare -p
的输出要高效得多,而且它还避免了其他提议的一些意外副作用。
以下可用于测试bash变量是否为关联数组。
[[ ${x@a} = A ]]
${x@a}
可以用来测试它是变量还是数组。
$ declare x; echo "${x@a}"
$ declare -a y; echo "${y@a}"
a
$ declare -A z; echo "${z@a}"
A