Zauważam, że aby ustawić IFS
nową linię, należy użyć prefiksu $
IFS=$'\n'
ale po prostu ustaw dwukropek
IFS=:
Czy \n
jest zmienną?
Że $'...'
w bash
nie jest parametr ekspansji, to szczególny rodzaj środki wprowadzone przez ksh93
które rozszerza te \n
, \x0a
, \12
kody do znaku nowej linii. zsh
również dodane \u000a
. ksh93
a bash
także \cj
, gdy zsh
ma \C-J
. ksh93
obsługuje również odmiany takie jak \x{a}
.
$
Jest sygnałem, że niektóre formy lub ekspansję. Ale w każdym razie, że różni się od innych form ekspansji że stosowanie $
(jak $((1 + 1))
, $param
lub $(cmd)
) tym, że nie jest wykonywana wewnątrz cudzysłowach lub tutaj dokumenty ( echo "$'x'"
wyjścia $'x'
we wszystkich muszli choć jest nieokreślony za POSIX) i jego ekspansja nie podlega ułamku + glob, jest zdecydowanie bliższy operatorowi cytowania niż operatorowi ekspansji.
IFS=\n
stworzyłaby FI, n
( \
jest traktowany jako operator cytowanie) i IFS="\n"
czy IFS='\n'
będzie ustawiony IFS na dwie kreski ułamkowe odwrócone i n
.
Możesz także użyć:
IFS='
'
lub
IFS="
"
lub
IFS=$'
'
Aby przejść do dosłownego przełamane, choć to mniej czytelne (i nie można zobaczyć inny niż przy użyciu rzeczy jak set list
w vi
czy $IFS
zawiera inne znaki odstępów w tym kodzie).
IFS=:
, IFS=':'
, IFS=":"
, IFS=$':'
Wszystkie zestaw do IFS :
, więc nie ma znaczenia, który używasz.
$'...'
wspiera (z odmian) przez co najmniej: ksh93
, zsh
, bash
, mksh
, Busybox sh
, FreeBSD sh
. ksh93
a bash
także mają $"..."
formę cudzysłowów używanych do lokalizacji tekstu, chociaż jest rzadko używany, ponieważ jest trudny do wdrożenia i użycia przenośnego i niezawodnego.
Te es
i fish
muszle mogą również korzystać \n
poza cytatami rozszerzyć do nowej linii.
Niektóre narzędzia, takie jak printf
niektóre implementacje echo
lub same awk
mogą je rozszerzyć \n
. Na przykład można zrobić:
printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only
do wyjścia znaku nowej linii, ale pamiętaj, że:
IFS = $ (printf '\ n')
nie będzie działać, ponieważ polecenie podstawienie ( $(...)
) usuwa wszystkie końcowe znaki nowego wiersza. Możesz jednak użyć:
eval "$(printf 'IFS="\n"')"
Który działa, ponieważ wyjście printf
kończy się "
znakiem, a nie znakiem nowej linii.
Teraz, dla kompletności, w rc
powłoce i pochodnych (takich jak es
lub akanga
), $'\n'
rzeczywiście jest rozwinięciem tej \n
zmiennej (zmiennej, której nazwa jest ciągiem dwóch znaków \
i n
). Pociski te nie mają ograniczeń co nazwy zmiennych znaków i może zawierać tylko jeden rodzaj cytatów: '...'
.
$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo
rc
wszystkie zmienne są również eksportowane do środowiska, ale przynajmniej w wariancie uniksowym rc
, w przypadku nazw zmiennych takich jak \n
wersja zmiennej środowiskowej jest poddawana kodowaniu:
; env | grep foo | sed -n l
__5cn=foo\001bar$
( 0x5c
będąca wartością bajtu ASCII \
; zobacz także, jak ta zmienna tablicowa została zakodowana bajtem 0x1 jako separatorem).
+1
dla zwykłego nieludzkiego poziomu wiedzyTo jest cytowanie ANSI-C :
W
$'\n'
ten sposób zostaje zastąpiony nowym wierszem.Nie ma to związku z rozszerzaniem parametrów powłoki , pomimo użycia
$
.źródło
Ciągi takie
$'\n'
zostały wprowadzoneksh93
i obecnie nie są częścią standardu POSIX.Pozwalają na użycie większości ucieczek typu C, np.
$'\u2345'
I takich, które również są obsługiwaneecho
.Zauważ, że jeśli nie podoba ci się (w przypadku ksh93 lub bash) korzystanie z tej metody ucieczki, nadal możesz użyć:
co jest równoważne, ale trudniejsze do odczytania.
BTW: To rozszerzenie już przekroczyło standardowy komitet POSIX, ale jest zaplanowane na SUSv8, który ma pojawić się nie wcześniej niż w 2020 roku, ponieważ najpierw musimy popracować nad opóźnieniem w stosunku do bieżącej listy błędów.
źródło
$'...'
rozszerzenia różni się odecho
. Są bardziej podobne do argumentów formatuprintf
. Forecho
, 0 jest wymagane w\0123
while for$'...'
iprintf
formacie,\0123
byłby\012
nowy wiersz, a następnie$'...'
specyfikacja jest wciąż dyskutowana. Obecnie proponowane sformułowanie wymaga rozwiązania.\uxxxx
rozszerzenia) i brak widocznej rozdzielczości, która uwzględniałaby istniejące wdrożenia. Dlatego może nie przejść do następnej wersji POSIX. Może mogliby pominąć\uxxxx
rozszerzenie dla wydania 8, abyśmy mogli przynajmniej mieć$'\n'
.