Se você usar diretamente as strings em um for
loop, ele funcionará por palavra (aqui em uma palavra: todo o conteúdo $test
desde que foi citado), não por caractere. Você precisa usar um while
loop com read
para analisar letra por letra ou para introduzir um parâmetro numérico que itere sobre a string.
Além disso, ao usar read
, você precisa garantir que novas linhas e espaços em branco não sejam interpretados como delimitadores e forçar read
a leitura de um caractere de cada vez.
Aqui está uma versão de trabalho:
#!/bin/bash
test="this is a
test"
printf %s "$test" | while IFS= read -r -N 1 a; do
if [[ "$a" == $'\n' ]] ; then
echo "FOUND NEWLINE"
fi
printf %s "$a"
done
Você pode substituir $'\n'
por $'\012'
ou $'\x0a'
, pois todos eles representam o mesmo código de nova linha. Mas não é o mesmo que \015
ou \r
- isso significa retorno de carro (retorno ao início da linha). Nos sistemas Linux, as novas linhas são representadas usando \n
, mas no Windows, por exemplo, elas são representadas por uma sequência \r\n
. Por isso, se você tiver um arquivo de texto do Windows, poderá detectar novas linhas também pesquisando \r
.
cat | while read line; do ...; done
, sabe que houve um retorno de carro para cada iteração. Se sua entrada puder ser arquivos\r
sem\n
, apenas transforme o arquivotr '\r' '\n'
enquanto processa a entrada. Se você só precisa saber se existem várias linhas:wc -l
.