A definição de IFS
apenas para uma nova linha não é suficiente. (Por que você também está dividindo em caracteres backspace, a propósito?)
No seu código, ${ROWS[@]}
(que é uma maneira estranha de escrever $ROWS
- ROWS
não é uma matriz) não está entre aspas duplas. (Se estivesse entre aspas duplas, você obteria uma única string, pois ROWS
não é uma matriz.) Portanto, o shell divide o valor da variável em campos em cada caractere IFS
e, em seguida, trata cada campo como um padrão glob. Por exemplo, se uma das linhas impressas pelo comando contiver o único caractere *
, isso será substituído pelos nomes dos arquivos no diretório atual.
Você pode desativar a globbing com set -f
. Na maioria dos casos em que você define IFS
para usar o recurso de divisão de campo do shell, também é necessário desativar globbing. Defina-o novamente com set +f
.
O idioma confiável para ler a linha de saída de um comando por linha é while IFS= read -r
.
some command returning multiple lines |
while IFS= read -r ROW; do
…
done
Observe que a maioria dos shells executa cada comando de um pipeline em um subshell separado. Portanto, se você precisar definir variáveis e usá-las após o loop, agrupe esses comandos em um grupo junto com o loop. (Ksh e zsh são as exceções, eles executam o último comando de um pipeline no shell pai).
some command returning multiple lines | {
while IFS= read -r ROW; do
…
row_count=$((row_count+1))
done
echo "There were $row_count rows."
}