Eu fiz o seguinte:
mapfile -t array < <(commands)
onde commands
produzirá saída separada por nova linha.
Então, com base no resultado, se não houver nada no array, saia, caso contrário continue:
[[ "${#array[@]}" -eq 0 ]] && exit
...
O problema é que a condição nunca é atendida. Porque quando o dito commands
não retorna nada, ${#array[@]}
retorna 1 em vez de 0.
Mas conta corretamente se eu atribuir o array da seguinte maneira:
array=($(commands))
Meus testes:
$ declare -a array
$ array=($(echo))
$ echo ${#array[@]}
0
$ unset array
$ mapfile -t array < <(echo)
$ echo ${#array[@]}
1
Por que?
Inicialmente usei o array=($(commands))
formato, mas shellcheck
sugeri que mapfile
o usasse.
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Isto é o que você obterá se o comando dentro do não imprimir nada:
Isto é o que você obterá se imprimir uma única linha vazia:
A linha vazia produz um elemento vazio, de forma bastante apropriada.
Se o seu programa produz essas linhas vazias e você não consegue pará-lo, você pode removê-las com, por exemplo
grep
, . Ou verifique o caso de um único elemento da matriz que está vazio.Remova as linhas vazias com
grep
:Verifique o elemento vazio:
Em
é diferente, pois o resultado da substituição do comando passa pela divisão de palavras, o que também remove qualquer espaço em branco à direita. E divide linhas com espaços em branco. (A própria substituição do comando também remove quaisquer novas linhas finais, não que isso importe aqui.)