Если вы непосредственно используете строки в forцикле, он будет работать для каждого слова (здесь одно слово: весь контент, $testпоскольку он указан в кавычках), а не для каждого символа. Вам нужно использовать whileцикл с read, чтобы анализировать букву за буквой, или вводить числовой параметр, который будет перебирать строку.
Кроме того, при использовании readнеобходимо убедиться, что символы новой строки и пробелы не интерпретируются как разделители, и заставить readчитать один символ за раз.
Вот рабочая версия:
#!/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
Вы можете заменить $'\n'на $'\012'или $'\x0a', так как все они представляют один и тот же код новой строки. Но это не то же самое, что \015или \r- это означает возврат каретки (возврат к началу строки). В системах Linux переводы строки представлены с использованием \n, но в Windows, например, они представлены последовательностью \r\nвместо. Вот почему, если у вас есть текстовый файл из Windows, вы можете обнаружить новые строки, также выполнив поиск \r.
cat | while read line; do ...; done, вы знаете, что для каждой итерации был возврат каретки. Если ваши входные данные могут быть файлами\rбез\n, просто преобразуйте файлtr '\r' '\n'во время обработки ввода. Если вам просто нужно знать , если есть несколько строк:wc -l.