Ich stelle fest, dass Newline IFS
mit einem $ als Präfix gesetzt werden sollte
IFS=$'\n'
aber wenn ein Doppelpunkt gesetzt ist, einfach
IFS=:
Ist \n
eine Variable?
Ich stelle fest, dass Newline IFS
mit einem $ als Präfix gesetzt werden sollte
IFS=$'\n'
aber wenn ein Doppelpunkt gesetzt ist, einfach
IFS=:
Ist \n
eine Variable?
Antworten:
Dass $'...'
in bash
nicht Parametern Expansion ist, es ist eine besondere Art von Zitat eingeführt , ksh93
dass erweitert diejenigen \n
, \x0a
, \12
Codes zu einem Newline - Zeichen. zsh
auch hinzugefügt \u000a
. ksh93
und bash
auch \cj
während zsh
hat \C-J
. ksh93
unterstützt auch Variationen wie \x{a}
.
Der $
ist ein Hinweis , dass es irgendeine Form oder Expansion. Aber in jedem Fall, Sie unterscheidet sich von den anderen Formen von Erweiterungen, die Verwendung $
(wie $((1 + 1))
, $param
oder $(cmd)
), dass sie nicht in doppelte Anführungszeichen oder hier Dokumente (durchgeführt echo "$'x'"
Ausgänge $'x'
in allen Schalen obwohl nicht spezifiziert ist pro POSIX) und seine Expansion ist nicht Gegenstand der Spaltung + glob, es ist definitiv näher an einem Quotierungsoperator als an einem Expansionsoperator.
IFS=\n
würde IFS auf setzen n
( \
wird als Anführungszeichen behandelt) und IFS="\n"
oder IFS='\n'
würde IFS auf die beiden Zeichen Backslash und setzen n
.
Sie können auch verwenden:
IFS='
'
oder
IFS="
"
oder
IFS=$'
'
Um eine wörtliche Newline geben, obwohl das weniger lesbar (und man kann nicht anders sehen als die Dinge mit wie set list
in , vi
ob $IFS
enthält anderes Abstand Zeichen in diesem Code).
IFS=:
, IFS=':'
, IFS=":"
, IFS=$':'
Alle Set IFS zu , :
so dass es keine Rolle spielt , die Sie verwenden.
$'...'
(mit Variationen) unterstützt wird , indem mindestens: ksh93
, zsh
, bash
, mksh
, busybox sh
, FreeBSD sh
. ksh93
und bash
hat auch eine $"..."
Form von Zitaten für die Lokalisierung von Text verwendet , obwohl es selten , wie es ist umständlich verwendet wird zu implementieren und portabel und zuverlässig zu nutzen.
Die es
und fish
Shells können auch \n
außerhalb von Anführungszeichen verwendet werden, um zu Newline zu erweitern.
Einige Tools mögen printf
, einige Implementierungen von echo
oder awk
können diese auch \n
selbst erweitern. Zum Beispiel kann man tun:
printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only
zur Ausgabe des Zeilenumbruchs, beachten Sie jedoch Folgendes:
IFS = $ (printf '\ n')
funktioniert nicht, da durch die Befehlsersetzung ( $(...)
) alle nachgestellten Zeilenumbrüche entfernt werden. Sie können jedoch verwenden:
eval "$(printf 'IFS="\n"')"
Was funktioniert, weil die Ausgabe von printf
in einem "
Zeichen endet , nicht in einem Zeilenumbruch.
Der Vollständigkeit halber ist in der rc
Shell und den Derivaten (wie es
oder akanga
) $'\n'
tatsächlich die Erweiterung dieser \n
Variablen (eine Variable, deren Name die Folge von zwei Zeichen \
und ist n
). Diese Schalen haben keine Beschränkung auf , welche Zeichen Variablennamen enthalten kann , und haben nur eine Art von Anführungszeichen: '...'
.
$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo
rc
Variablen werden ebenfalls alle in die Umgebung exportiert, aber zumindest in der Unix-Variante von rc
, für Variablennamen wie \n
, wird die Umgebungsvariablenversion einer Form der Codierung unterzogen:
; env | grep foo | sed -n l
__5cn=foo\001bar$
( Dies 0x5c
ist der Bytewert von ASCII \
; siehe auch, wie diese Arrayvariable mit einem 0x1-Byte als Trennzeichen codiert wurde).
Dies ist ANSI-C-Zitat :
Formularbegriffe
$'string'
werden gesondert behandelt. Das Wort wird zu erweitertstring
, wobei mit einem umgekehrten Schrägstrich versehene Zeichen gemäß dem ANSI C-Standard ersetzt werden.
Somit $'\n'
wird durch eine neue Zeile ersetzt.
Dies hat nichts mit der Erweiterung der Shell-Parameter zu tun , obwohl $
.
Strings wie $'\n'
wurden ksh93
von POSIX eingeführt und sind derzeit nicht Bestandteil des POSIX-Standards.
Sie ermöglichen die Verwendung der meisten C-ähnlichen Escapes, z. B. $'\u2345'
und der Escapes, die auch von unterstützt werden echo
.
Beachten Sie, dass Sie Folgendes verwenden können, wenn Sie diese Escape-Methode nicht verwenden möchten (im Fall von ksh93 oder bash):
IFS='
'
Das ist äquivalent, aber schwerer zu lesen.
Übrigens: Diese Erweiterung hat das POSIX-Standardkomitee bereits bestanden, es ist jedoch für SUSv8 geplant , das voraussichtlich nicht vor dem Jahr 2020 erscheinen wird, da wir zuerst an unserer Verzögerung hinter der aktuellen Liste der Fehler arbeiten müssen.
$'...'
Erweiterungen unterscheiden sich von denen von echo
. Sie ähneln eher denen für das Formatargument von printf
. Für echo
wird eine 0 in \0123
while für $'...'
und printf
format benötigt, \0123
wäre \012
eine neue Zeile gefolgt von einem Wurf 3.
$'...'
Spezifikation noch diskutiert wird. Mit dem derzeit vorgeschlagenen Wortlaut sind noch einige Probleme zu lösen.
\uxxxx
Erweiterung) und es ist keine Lösung in Sicht, die bestehende Implementierungen berücksichtigen würde. Es wird also möglicherweise nicht in die nächste POSIX-Version aufgenommen. Vielleicht könnten sie die \uxxxx
Erweiterung für Ausgabe 8 auslassen, so dass wir zumindest noch haben können $'\n'
.
+1
für den üblichen unmenschlichen Wissensstand