Come posso verificare se un array associativo è dichiarato in Bash? Posso provare per una variabile come:Nel test Bash se viene dichiarato un array associativo
[ -z $FOO ] && echo nope
ma non sembra funzionare per gli array associativi:
$unset FOO
$declare -A FOO
$[ -z $FOO ] && echo nope
nope
$FOO=([1]=foo)
$ [ -z $FOO ] && echo nope
nope
$ echo ${FOO[@]}
foo
EDIT:
Grazie per le vostre risposte, entrambi sembrano per lavorare quindi decido:
$ 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
e il altro:
$ 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: velocità
Let confrontare la soluzione di Chepner contro i precedenti:
#!/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
Bene che era veloce.
Grazie ancora, ragazzi.
Finora non sono riuscito a trovare alcun caso in cui "FOO [@]" nel codice precedente possa produrre risultati diversi rispetto a "FOO". Se l'intento fosse anche quello di rilevare che FOO non è un array, non conosco alcuna soluzione che non richieda l'uso di 'declare' (il controllo della dimensione dell'array offerto qui sotto non aiuta). –
Immagino che un bash abbastanza nuovo possa evitare 'declare' usando' $ {FOO @ A} 'per ottenere le stesse informazioni su' FOO'. –