Как проверить, объявлен ли ассоциативный массив в Bash? Я могу проверить переменную как:В тесте 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
EDIT:
Спасибо за ваши ответы, как кажется для работы, поэтому я разрешаю скорость решить:
$ 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
EDIT 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
Хорошо это было быстро.
Еще раз спасибо, ребята.
Я до сих пор не смог найти случай, когда «FOO [@]» в приведенном выше коде может произвести любой другой результат, чем просто «FOO». Если целью было также обнаружить, что FOO не является массивом, я не знаю ни одного решения, которое не требует использования 'declare' (приведенная ниже проверка размера массива не помогает). –
Я думаю, что новый достаточно баш мог бы избежать 'declare', используя' $ {FOO @ A} ', чтобы получить ту же информацию о' FOO'. –