tcsh по сравнению с zsh. Escape/управляющие символы

Если Вы непосредственно используете строки под 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.

2
19.01.2013, 01:07
1 ответ

С extendedglob включенный, в zsh, ^ отрицание globbing оператор, таким образом, -sX:^0 средства любое имя файла, запускающееся с -sX: не сопровождаемый 0.

Необходимо заключить его в кавычки (как в '-sX:^0' или -sX:\^0 или -s"X:^0"...), если Вы не хотите, чтобы это было интерпретировано как globbing оператор.

Обратите внимание на это в Оболочке Bourne и ее предшественниках, ^ был также оператор канала, так необходимый заключенный в кавычки также.

4
27.01.2020, 22:01
  • 1
    Спасибо. Как точно я должен заключить это в кавычки для получения того же поведения как в tcsh? Если я полностью заключаю в кавычки -sX:^0? –  Amelio Vazquez-Reina 18.01.2013, 21:47

Теги

Похожие вопросы