Вопрос

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

IFS=$'\n'
  • Что это знак доллара иметь в видуточно?
  • Что это делает в этом конкретном случае?
  • Где я могу прочитать больше об этом конкретном использовании (Google не допускает специальных символов в поисках, и я не знаю, что искать иное)?

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

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

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' И подумал, может ли кто -нибудь дать мне объяснение об этом.

Это было полезно?

Решение

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

$'somestring' это Синтаксис для струнных литералов с последовательностями побега. Отказ Так в отличие от '\n', $'\n' На самом деле это линейный разбил.

Другие советы

Просто чтобы дать конструкции его официальное имя: Строки формы $'...' называются Ansi c-цитируемые строки.

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

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

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

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

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

Список поддерживаемых последовательностей побега:

Последовательности побега BackSlash, если они присутствуют, декодированы следующим образом:

A Alert (Bell)

b Backspace

e e эрективный символ (не ANSI C)

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

n Newline

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

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

V Вертикальная вкладка

Backslash

'Единственная цитата

"Двойная цитата

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

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

uhhhhhh unicode (ISO/IEC 10646), чье значение - шестнадцатеричное значение HHHH (от одной до четырех шестнадцатеричных цифр)

Uhhhhhhhhhhhh unicode (ISO/IEC 10646).

cx A Control-x символ

Расширенный результат является односложенным, как будто знак доллара не присутствовал.


1] Однако вы можете встроить действительный новеньки в «...» и «...» Strings; т.е. вы можете определить строки, которые охватывают несколько линий.

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

Слова в форме «$ 'String'» обращаются особым образом. Слово расширяется до строки, с обратными символами, замененными, как указано стандартом ANSI-C. Последовательности побега BackSlash можно найти в документации Bash.Found

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

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

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

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

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

Вы можете проверить строки ANSI C-цитируемых с помощью команды 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top