Si desea detectar una matriz con elementos vacíos ,arr=("" "")
como vacío, igual quearr=()
Puede pegar todos los elementos juntos y verificar si el resultado es de longitud cero. (Construir una copia aplanada del contenido de la matriz no es ideal para el rendimiento si la matriz puede ser muy grande. Pero espero que no estés usando bash para programas como ese ...)
Pero se "${arr[*]}"
expande con elementos separados por el primer carácter de IFS
. Por lo tanto, debe guardar / restaurar IFS y hacer IFS=''
que esto funcione, o bien comprobar que la longitud de la cadena == # de elementos de la matriz - 1. (Una matriz de n
elementos tiene n-1
separadores). Para lidiar con eso fuera de uno, es más fácil rellenar la concatenación en 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
caso de prueba 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
Por desgracia, esta falla por arr=()
: [[ 1 -ne 0 ]]
. Por lo tanto, primero deberá verificar las matrices realmente vacías por separado.
O conIFS=''
. Probablemente quiera guardar / restaurar IFS en lugar de usar una subshell, porque no puede obtener un resultado de una subshell fácilmente.
# inside a () subshell so we don't modify our own IFS
(IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
ejemplo:
$ arr=("" "")
$ (IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
+ IFS=
+ [[ -n '' ]]
+ echo empty array
empty array
no funciona con arr=()
- sigue siendo sólo la cadena vacía.
=
es un operador de cadena. En este caso, funciona bien, pero en su lugar usaría el operador aritmético adecuado-eq
(en caso de que quisiera cambiar a-ge
o-lt
, etc.).