在Bash测试中,是否声明了关联数组

前端之家收集整理的这篇文章主要介绍了在Bash测试中,是否声明了关联数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何测试是否在 Bash中声明了关联数组?我可以测试一个变量,如:
  1. [ -z $FOO ] && echo nope

但我似乎不适用于关联数组:

  1. $unset FOO
  2. $declare -A FOO
  3. $[ -z $FOO ] && echo nope
  4. nope
  5. $FOO=([1]=foo)
  6. $[ -z $FOO ] && echo nope
  7. nope
  8. $echo ${FOO[@]}
  9. foo

编辑:

谢谢你的答案,两者似乎都有效,所以我让速度决定:

  1. $cat test1.sh
  2. #!/bin/bash
  3. for i in {1..100000}; do
  4. size=${#array[@]}
  5. [ "$size" -lt 1 ] && :
  6. done
  7. $time bash test1.sh #best of five
  8.  
  9. real 0m1.377s
  10. user 0m1.357s
  11. sys 0m0.020s

和另外一个:

  1. $cat test2.sh
  2. #!/bin/bash
  3.  
  4. for i in {1..100000}; do
  5. declare -p FOO >/dev/null 2>&1 && :
  6. done
  7. $time bash test2.sh #again,the best of five
  8.  
  9. real 0m2.214s
  10. user 0m1.587s
  11. sys 0m0.617s

编辑2:

让我们快速比较Chepner的解决方案与之前的解决方案:

  1. #!/bin/bash
  2.  
  3. for i in {1..100000}; do
  4. [[ -v FOO[@] ]] && :
  5. done
  6. $time bash test3.sh #again,the best of five
  7.  
  8. real 0m0.409s
  9. user 0m0.383s
  10. sys 0m0.023s

那很快.

伙计们,再次感谢

在bash 4.2或更高版本中,您可以使用-v选项:
  1. [[ -v FOO[@] ]] && echo "FOO set"

请注意,在任何版本中,使用

  1. declare -A FOO

实际上并不会立即创建关联数组;它只是在名称FOO上设置一个属性,允许您将名称指定为关联数组.在第一次分配之前,数组本身不存在.

猜你在找的Bash相关文章