Se você usar diretamente as strings em um forloop, ele funcionará por palavra (aqui em uma palavra: todo o conteúdo $testdesde que foi citado), não por caractere. Você precisa usar um whileloop com readpara 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 reada 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 \015ou \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\rsem\n, apenas transforme o arquivotr '\r' '\n'enquanto processa a entrada. Se você só precisa saber se existem várias linhas:wc -l.