Если Вы непосредственно используете строки под a for
цикл, это будет работать на слово (здесь на одном слове: целое содержание $test
так как это заключается в кавычки), не на символ. Необходимо использовать a 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
.
С extendedglob
включенный, в zsh, ^
отрицание globbing оператор, таким образом, -sX:^0
средства любое имя файла, запускающееся с -sX:
не сопровождаемый 0
.
Необходимо заключить его в кавычки (как в '-sX:^0'
или -sX:\^0
или -s"X:^0"
...), если Вы не хотите, чтобы это было интерпретировано как globbing оператор.
Обратите внимание на это в Оболочке Bourne и ее предшественниках, ^
был также оператор канала, так необходимый заключенный в кавычки также.
-sX:^0
? – Amelio Vazquez-Reina 18.01.2013, 21:47