Si vous voulez détecter un tableau avec des éléments vides , commearr=("" "")
vide, identique àarr=()
Vous pouvez coller tous les éléments ensemble et vérifier si le résultat est zéro. (Construire une copie aplatie du contenu du tableau n'est pas idéal pour la performance si le tableau peut être très grand. Mais j'espère que vous n'utilisez pas bash pour de tels programmes ...)
Mais se "${arr[*]}"
développe avec des éléments séparés par le premier caractère de IFS
. Donc, vous devez enregistrer / restaurer IFS et le faire IFS=''
pour que cela fonctionne, ou bien vérifiez que la longueur de la chaîne == # d'éléments de tableau - 1. (Un tableau d' n
éléments a des n-1
séparateurs). Pour régler ce problème, il est plus facile d’enrichir la concaténation de 1
arr=("" "")
## Assuming default non-empty IFS
## TODO: also check for ${#arr[@]} -eq 0
concat="${arr[*]} " # n-1 separators + 1 space + array elements
[[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
cas de test avec set -x
### a non-empty element
$ arr=("" "x")
+ arr=("" "x")
$ concat="${arr[*]} "; [[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
+ concat=' x '
+ [[ 3 -ne 2 ]]
+ echo not empty array
not empty array
### 2 empty elements
$ arr=("" "")
+ arr=("" "")
$ concat="${arr[*]} "; [[ "${#concat}" -ne "${#arr[@]}" ]] && echo not empty array || echo empty array
+ concat=' '
+ [[ 2 -ne 2 ]]
+ echo empty array
empty array
Malheureusement , cela ne fonctionne pas pour arr=()
: [[ 1 -ne 0 ]]
. Il est donc nécessaire de vérifier séparément les tableaux réellement vides.
Ou avecIFS=''
. Vous voudrez probablement sauvegarder / restaurer IFS au lieu d'utiliser un sous-shell, car vous ne pouvez pas obtenir facilement le résultat d'un sous-shell.
# inside a () subshell so we don't modify our own IFS
(IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
exemple:
$ arr=("" "")
$ (IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
+ IFS=
+ [[ -n '' ]]
+ echo empty array
empty array
ne fonctionne avec arr=()
- il est encore juste la chaîne vide.
=
s'agit d'un opérateur de chaîne. Il se trouve que cela fonctionne bien dans ce cas, mais j'utiliserais-eq
plutôt l' opérateur arithmétique approprié (juste au cas où je voudrais passer à-ge
ou-lt
, etc.).