Я замечаю, что устанавливать новую строку IFS
следует с префиксом $
IFS=$'\n'
но если установить двоеточие, просто
IFS=:
Является \n
ли переменная?
Это $'...'
в bash
не параметр расширения, это особый вид цитаты введен ksh93
, расширяющие те \n
, \x0a
, \12
кода к символу новой строки. zsh
также добавил \u000a
. ksh93
а bash
также есть, \cj
пока zsh
имеет \C-J
. ksh93
также поддерживает такие варианты, как \x{a}
.
Это $
сигнал, что это какая-то форма или расширение. Но в любом случае он отличается от других форм расширений, которые используют $
(например $((1 + 1))
, $param
или $(cmd)
), в том, что он не выполняется внутри двойных кавычек или здесь документов ( echo "$'x'"
выводится $'x'
во всех оболочках, хотя не определено для POSIX), и его расширение не подлежит разделению + glob, он определенно ближе к оператору цитирования, чем к оператору раскрытия.
IFS=\n
установит IFS n
( \
обрабатывается как оператор цитирования) и IFS="\n"
или IFS='\n'
установит IFS для двух символов обратной косой черты и n
.
Вы также можете использовать:
IFS='
'
или
IFS="
"
или
IFS=$'
'
Чтобы передать буквальный символ новой строки, хотя это менее разборчивым (и никто не может видеть , чем использовать такие вещи , как set list
в vi
том , $IFS
содержит другие символы распорных в этом коде).
IFS=:
, IFS=':'
, IFS=":"
, IFS=$':'
Весь установленный МФС к :
так что это не имеет значения , которые вы используете.
$'...'
поддерживается (с вариациями) , по меньшей мере: ksh93
, zsh
, bash
, mksh
, BusyBox sh
, FreeBSD sh
. ksh93
и bash
также имеют $"..."
форму кавычек, используемых для локализации текста, хотя это редко используется, поскольку это громоздко для развертывания и использования портативно и надежно.
В es
и fish
оболочки могут также использовать \n
вне кавычек , чтобы развернуть на новую строку.
Некоторые инструменты, такие как printf
, некоторые реализации echo
или awk
могут также расширять их \n
сами. Например, можно сделать:
printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only
для вывода символа новой строки, но обратите внимание, что:
IFS = $ (printf '\ n')
не будет работать, потому что команда substitution ( $(...)
) удаляет все завершающие символы новой строки. Однако вы можете использовать:
eval "$(printf 'IFS="\n"')"
Который работает, потому что вывод printf
заканчивается на "
символе, а не переводе строки.
Теперь, для полноты, в rc
оболочке и производных (например, es
or akanga
), $'\n'
действительно расширение этой \n
переменной (переменная, имя которой представляет собой последовательность из двух символов \
и n
). Эти оболочки не имеют ограничения на то , что символы имена переменных могут содержать и только один тип кавычек: '...'
.
$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo
rc
Все переменные также экспортируются в среду, но, по крайней мере, в варианте Unix rc
для имен переменных, таких как \n
версия переменной среды, имеет вид кодировки:
; env | grep foo | sed -n l
__5cn=foo\001bar$
( 0x5c
будучи байтовым значением ASCII \
; см. также, как эта переменная массива была закодирована с байтом 0x1 в качестве разделителя).
+1
за обычный нечеловеческий уровень знанийЭто ANSI-C цитирование :
Таким образом
$'\n'
заменяется символом новой строки.Это не связано с расширением параметров оболочки , несмотря на использование
$
.источник
Такие строки, как
$'\n'
были введеныksh93
и в настоящее время не являются частью стандарта POSIX.Они позволяют использовать большинство C-подобных выходов, например,
$'\u2345'
и выходы, которые также поддерживаютсяecho
.Обратите внимание, что если вы не любите (в случае ksh93 или bash) использовать этот метод escape, вы все равно можете использовать:
что эквивалентно, но труднее читать.
Кстати: это расширение уже прошло стандартный комитет POSIX, но оно запланировано на SUSv8, который, как ожидается, появится не ранее 2020 года, потому что сначала нам нужно работать над нашим отставанием от текущего списка ошибок.
источник
$'...'
разложения отличается отecho
. Они больше похожи на аргументы форматаprintf
. Дляecho
, 0 требуется в\0123
то время как для$'...'
иprintf
формат,\0123
будет\012
новая строка, за которой следует буква 3.$'...'
спецификация все еще обсуждается. Есть несколько вопросов, которые еще предстоит решить с помощью предлагаемой в настоящее время формулировки.\uxxxx
расширения), и не видно никакого решения, которое бы соответствовало существующим реализациям. Так что он может не попасть в следующую версию POSIX. Может быть, они могли бы оставить\uxxxx
расширение для выпуска 8, так что мы все еще можем иметь по крайней мере$'\n'
.