Se si desidera rilevare un array con elementi vuoti , comearr=("" "")
vuoto, uguale aarr=()
Puoi incollare tutti gli elementi insieme e verificare se il risultato è di lunghezza zero. (Costruire una copia appiattita del contenuto dell'array non è l'ideale per le prestazioni se l'array potrebbe essere molto grande. Ma si spera che non si usi bash per programmi del genere ...)
Ma si "${arr[*]}"
espande con elementi separati dal primo carattere di IFS
. Quindi è necessario salvare / ripristinare IFS e farlo IFS=''
per farlo funzionare, oppure verificare che la lunghezza della stringa == # di elementi dell'array - 1. (Un array di n
elementi ha n-1
separatori). Per far fronte a quello off-by-one, è più facile riempire la concatenazione di 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
test case con 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
Purtroppo questo non riesce per arr=()
: [[ 1 -ne 0 ]]
. Quindi dovresti controllare prima gli array effettivamente vuoti separatamente.
O conIFS=''
. Probabilmente vorresti salvare / ripristinare IFS invece di usare una subshell, perché non puoi ottenere facilmente un risultato da una subshell.
# inside a () subshell so we don't modify our own IFS
(IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
esempio:
$ arr=("" "")
$ (IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
+ IFS=
+ [[ -n '' ]]
+ echo empty array
empty array
non funziona con arr=()
- è ancora solo una stringa vuota.
=
è un operatore di stringa. In questo caso funziona bene, ma in-eq
alternativa utilizzerei l'operatore aritmetico corretto (nel caso in cui volessi passare a-ge
o-lt
, ecc.).