Se você deseja detectar uma matriz com elementos vazios , comoarr=("" "")
vazio, igual aarr=()
Você pode colar todos os elementos juntos e verificar se o resultado tem tamanho zero. (Construir uma cópia achatada do conteúdo da matriz não é ideal para desempenho, se a matriz puder ser muito grande. Mas espero que você não esteja usando o bash para programas como esse ...)
Mas se "${arr[*]}"
expande com elementos separados pelo primeiro caractere de IFS
. Portanto, você precisa salvar / restaurar o IFS e fazer IFS=''
isso para funcionar, ou verifique se o comprimento da string == # dos elementos da matriz - 1. (Uma matriz de n
elementos possui n-1
separadores). Para lidar com isso de um por um, é mais fácil diminuir a concatenação em 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 teste com 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
Infelizmente, este falhar por arr=()
: [[ 1 -ne 0 ]]
. Portanto, você precisa verificar as matrizes realmente vazias primeiro separadamente.
Ou comIFS=''
. Provavelmente, você deseja salvar / restaurar o IFS em vez de usar um subshell, porque não é possível obter um resultado de um subshell facilmente.
# inside a () subshell so we don't modify our own IFS
(IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
exemplo:
$ arr=("" "")
$ (IFS='' ; [[ -n "${arr[*]}" ]] && echo not empty array || echo empty array)
+ IFS=
+ [[ -n '' ]]
+ echo empty array
empty array
se trabalhar com arr=()
- ainda é apenas uma string vazia.
=
é um operador de cadeia. Por acaso funciona bem neste caso, mas eu usaria o operador aritmético adequado-eq
(apenas no caso de querer mudar para-ge
ou-lt
etc.).