Каково точное значение IFS=$ 'n'?



если следующий пример, который устанавливает IFS переменная окружения для символа перевода строки...



IFS=$'n'



  • что значит знак значит
    ровно?


  • что он делает в данном конкретном
    случае?

  • где я могу прочитать больше об этом конкретном использовании (Google не разрешает специальные символы в поиске, и я не знаю, что искать в противном случае)?


Я знаю, что такое IFS переменная окружения есть, А какая то n символ (перевод строки), но почему бы просто не использовать следующую форму:
IFS="n" (который не работает)?



например, если я хочу, чтобы цикл через каждую строку файла и хотите использовать цикл for, я мог бы сделать это:



for line in (< /path/to/file); do
echo "Line: $line"
done


однако, это не будет работать правильно, если IFS установлен символ перевода строки. Чтобы заставить его работать, я должен был бы сделать это:



OLDIFS=$IFS
IFS=$'n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS


Примечание: мне не нужен другой способ для делая то же самое, я уже знаю многих других... Мне только любопытно об этом $'n' и задавался вопросом, Может ли кто-нибудь дать мне объяснение по этому поводу.

566   6  

6 ответов:

обычно bash не интерпретирует escape-последовательности в строковых литералах. Так что если вы пишете \n или "\n" или '\n', это не перевод строки - это буква n (в первом случае) или обратная косая черта, за которой следует буква n (в двух других случаях).

$'somestring' это синтаксис для строковых литералов с escape-последовательностями. Так что в отличие от '\n',$'\n' на самом деле-это перевод строки.

от http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html:

слова в виде " $ 'STRING '" являются лечится по-особому. Слово расширяется до строки, с помощью обратная косая черта-экранированные символы заменены как определено стандартом ANSI-C. Обратной косой черты escape-последовательности могут быть найдено в документации Bash.нашел

Я предполагаю, что это заставляет скрипт, чтобы избежать линии подачи соответствующего стандарту ANSI-C и норматив.

просто чтобы дать конструкции его официальное название: строки вида $'...' называют ANSI C-quoted strings.

то есть, как в строках [ANSI] C,обратные escape-последовательности признаны и расширены до их буквального эквивалента (полный список поддерживаемых escape-последовательностей см. ниже).

после эта экспансия, $'...' строки вести себя так же, как '...' строки - то есть, они рассматриваются как литералы не подлежит никаким [дальнейшим] расширениям оболочки.

например, $'\n' расширяется до литерального символа новой строки - который является чем-то обычным строковым литералом bash (будь то '...' или "...") не обойтись.[1]

еще одна интересная особенность заключается в том, что строки в кавычках ANSI C могут экранироваться ' (одинарные кавычки), а \', который, '...' (обычные строки в одинарных кавычках) не может:

echo $'Honey, I\'m home' # OK; this cannot be done with '...'

список поддерживаемых escape-последовательности:

escape-последовательности обратной косой черты, если таковые имеются, декодируются следующим образом:

\a тревога (звонок)

\b клавиша

\e \Ми escape-символ (не ANSI C)

\f форма подачи

\n новая строка

\r возврат каретки

\t горизонтальная вкладка

\v вертикальная вкладка

\ обратная косая черта

\' одинарные кавычки

\" двойная цитата

\nnn восьмиразрядный символ, значение которого является восьмеричным значением nnn (от одной до трех цифр)

\xHH восьмиразрядный символ, значение которого является шестнадцатеричным значением HH (одна или две шестнадцатеричные цифры)

\uHHHH Юникод (ISO/IEC 10646) символ, значение которого является шестнадцатеричным значением HHHH (от одной до четырех шестнадцатеричных цифр)

\UHHHHHHHH символ Unicode (ISO / IEC 10646), значение которого является шестнадцатеричным значением HHHHHHHH (от одной до восьми шестнадцатеричных цифр)

\cx контрольно-х символов

расширенный результат в одинарных кавычках, как если бы знак доллара не присутствовал.


[1] Вы можете, однако, добавьте фактический новые строки в '...' и." .."строки, т. е. вы можете определить строки, которые охватывают несколько строк.

восстановление IFS по умолчанию-это OLDIFS=$IFS Не надо. Запустите новый IFS в подрешетке, чтобы избежать переопределения IFS по умолчанию:

ar=(123 321); ( IFS=$'\n'; echo ${ar[*]} )

кроме того, я действительно не верю, что вы полностью восстановите старые IFS. Вы должны дважды цитировать его, чтобы избежать разрыва строки, такие как OLDIFS="$IFS".

ANSI C-кавычки строки является ключевым моментом. Спасибо @mklement0 .

вы можете проверить строки ANSI C-quoted с помощью команды od.

echo -n $'\n' | od -c
echo -n '\n' | od -c
echo -n $"\n" | od -c
echo -n "\n" | od -c

выходы:

0000000  \n  
0000001

0000000   \   n   
0000002

0000000   \   n   
0000002

0000000   \   n   
0000002

вы можете знать значение ясно выходами.

это похоже на извлечение значения из переменной:

VAR='test'
echo VAR
echo $VAR

отличаются, поэтому знак доллара в основном оценивает содержимое.

Comments

    Ничего не найдено.