Если следующий пример, который устанавливает 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'
и интересно, может ли кто-нибудь дать мне объяснение по этому поводу .
\n
это просто (экранированная) буква n. Вы правы, что'\n'
и"\n"
есть люфт с последующим n.$'\n'
это специфично для bash - он не будет работать в оболочке POSIX (/bin/sh
). Чтобы получить тот же эффект в соответствии с POSIX, вы можете ввестиIFS='
, затем нажать return, чтобы ввести фактический символ новой строки, а затем ввести закрытие'
IFS=$(echo -e '\n')
также должен делать это POSIX-совместимым способом.-e
не определен и\n
без него-e
работает как расширение XSI: pubs.opengroup.org/onlinepubs/9699919799/utilities/… .printf '\n'
скалы;)Просто чтобы дать конструкта его официальное название : строки вида
$'...'
называются ANSI C-строки в кавычках .То есть, как и в строках [ANSI] C, escape-последовательности с обратной косой чертой распознаются и расширяются до их буквального эквивалента (полный список поддерживаемых escape-последовательностей см. Ниже).
После этого раскрытия
$'...'
строки ведут себя так же, как'...'
строки, т. Е. Они рассматриваются как литералы, НЕ подлежащие каким-либо [дальнейшим] расширениям оболочки .Например,
$'\n'
расширяется до буквального символа новой строки - чего не может сделать обычный строковый литерал bash (независимо от того,'...'
или"..."
). [1]Еще одна интересная особенность заключается в том, что строки в кавычках ANSI C могут экранировать
'
(одинарные кавычки) как\'
, чего'...'
(обычные одинарные кавычки) не могут:Список поддерживаемых escape-последовательностей :
[1] Вы можете, однако, встроить настоящие символы новой строки в строки '...' и "..."; то есть вы можете определить строки, которые охватывают несколько строк.
источник
Из http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html :
Я предполагаю, что это заставляет скрипт уйти от перевода строки в соответствии с надлежащим стандартом ANSI-C.
источник
Повторное восстановление IFS по умолчанию - в этом
OLDIFS=$IFS
нет необходимости. Запустите новый IFS в подоболочке, чтобы избежать переопределения IFS по умолчанию:Кроме того, я действительно не верю, что вы полностью восстановите старую IFS. Вы должны заключить его в двойные кавычки, чтобы избежать разрыва строки, например
OLDIFS="$IFS"
.источник
args=$(IFS='&'; echo "$*")
. восстановлениеIFS
к$' \t\n'
в Bourne оболочки дружественно не подвиг.Besides I don't really believe you recover the old IFS fully
: разделение слов не выполняется на правой стороне присваивания переменных (но удаление кавычек выполняется), поэтомуOLDIFS=$IFS
иOLDIFS="$IFS"
ведут себя так же.Строки в кавычках ANSI C являются ключевым моментом. Спасибо @ mklement0.
Вы можете проверить строки в кавычках ANSI C с помощью команды od.
Выходы:
Вы можете четко узнать значение по результатам.
источник
Это похоже на получение значения из переменной:
разные, поэтому знак доллара в основном оценивает содержание.
источник
$'FOO'
(в отличие от того, о$FOO
чем не шла речь) - строковый литерал. Если вы выполнитеecho $'VAR'
, вы увидите, что он печатает строкуVAR
, а неtest
.