Am Anfang eines Bash-Shell-Skripts steht die folgende Zeile:
IFS=$'\n'
Welche Bedeutung hat diese Symbolsammlung?
bash
shell-script
command-line
Abdul Al Hazred
quelle
quelle
IFS=$'\n'
ist ein bashism (+ andere Schalen, verwenden ANSI-C Zitiert für Abhilfen siehe stackoverflow.com/questions/10748703/...Antworten:
IFS
steht für "internes Feldtrennzeichen". Es wird von der Shell verwendet, um zu bestimmen, wie die Wortteilung durchgeführt wird, dh wie Wortgrenzen erkannt werden.Versuchen Sie dies in einer Shell wie bash (andere Shells können dies anders handhaben, zum Beispiel zsh):
Der Standardwert für
IFS
besteht aus Leerzeichen (um genau zu sein: Leerzeichen, Tabulator und Zeilenvorschub). Jedes Zeichen kann eine Wortgrenze sein. Daher wird mit dem Standardwert vonIFS
die obige Schleife gedruckt:Mit anderen Worten, die Shell denkt, dass Leerzeichen eine Wortgrenze sind.
Versuchen Sie nun die Einstellung,
IFS=:
bevor Sie die Schleife ausführen. Dieses Mal lautet das Ergebnis:Jetzt teilt sich die Shell auch
mystring
in Wörter auf - aber jetzt wird nur ein Doppelpunkt als Wortgrenze behandelt.Das erste Zeichen von
IFS
ist special: Es wird verwendet, um Wörter in der Ausgabe zu begrenzen, wenn die spezielle$*
Variable verwendet wird (Beispiel aus dem Advanced Bash Scripting Guide , in dem Sie auch weitere Informationen zu speziellen Variablen wie dieser finden):Vergleichen mit:
Beachten Sie, dass in beiden Beispielen wird die Schale noch alle Zeichen behandeln
:
,-
und;
als Wortgrenzen. Das einzige, was sich ändert, ist das Verhalten von$*
.Ein weiterer wichtiger Aspekt ist die Behandlung des so genannten "IFS-Whitespace" . Grundsätzlich werden
IFS
führende und nachfolgende Leerzeichen , sobald sie Leerzeichen enthalten, von der zu teilenden Zeichenfolge entfernt, bevor sie verarbeitet werden. Eine Folge von aufeinanderfolgenden Leerzeichen begrenzt die Felder ebenfalls. Dies gilt jedoch nur für die Whitespace-Zeichen, die tatsächlich in vorhanden sindIFS
.Betrachten wir zum Beispiel die Zeichenfolge
"a:b:: c d "
(Leerzeichen am Ende und zwei Leerzeichen zwischenc
undd
).IFS=:
ihm würde in vier Felder aufgeteilt werden:"a"
,"b"
,""
(leere Zeichenkette) und" c d "
(wieder zwei Räume zwischenc
undd
). Beachten Sie das führende und nachfolgende Leerzeichen im letzten Feld.IFS=' :'
wäre es in fünf Felder unterteilt werden:"a"
,"b"
,""
(leere Zeichenkette),"c"
und"d"
. Kein führendes und nachfolgendes Leerzeichen.Beachten Sie, wie im zweiten Beispiel mehrere aufeinanderfolgende Leerzeichen zwei Felder voneinander trennen, während dies bei mehreren aufeinanderfolgenden Doppelpunkten nicht der Fall ist (da es sich nicht um Leerzeichen handelt).
Was
IFS=$'\n'
ist , dass eineksh93
Syntax auch unterstütztbash
,zsh
,mksh
und FreeBSDsh
(mit Variationen zwischen allen Schalen). Zitieren der Bash-Manpage:\n
ist die Escape-Sequenz für eine neue Zeile und wird daherIFS
auf ein einzelnes Zeichen für eine neue Zeile festgelegt.quelle
bash
Skriptanleitung oder was auch immer. In der Hauptsache fehlen die Informationen, die auf solchen Links verfügbar sind, in wichtigen Punkten. Auf jeden Fall fehlen also zwei wichtige Punkte beim Aufteilen der Shell - Globbing und IFS-Whitespace.unset IFS
eine Shell ganz anders verhält alsIFS=
. Auch das erste Byte in IFS ist etwas Besonderes"${named_array[*]}"
- aber es spielt keine$IFS
ist eine der beiden Hauptaufgaben, die beim Erweitern einer Variablen ohne Anführungszeichen im Listenkontext ausgeführt wird (dies ist dersplit
Teil dessplit+glob
Operators). Der andere ist am Fressen. Wenn Sie die Arbeitsteilung verwenden, müssen Sie im Allgemeinen ein Problemset -f
lösen, um dasglob
Teil zu deaktivieren .$IFS
wird auch vomread
eingebauten Befehl verwendetIn einfachen Anführungszeichen werden einige Zeichen speziell ausgewertet. Beispielsweise
\n
wird in eine neue Zeile übersetzt.Diese bestimmte Zeile weist der Variablen IFS also eine neue Zeile zu. IFS wiederum ist eine spezielle Variable in bash: Internal Field Separator. Wie
man bash
gesagt esquelle
dollared single quotes
die sich von einfachen einfachen Anführungszeichen unterscheidet.Kurz gesagt,
IFS=$'\n'
ordnen Sie\n
der Variablen einen Zeilenvorschub zuIFS
.$'string'
construct ist ein Zitiermechanismus, mit dem ANSI C-ähnliche Escape-Sequenzen dekodiert werden. Diese Syntax stammt ausksh93
und war tragbar moderne Shell wiebash
,zsh
,pdksh
,busybox sh
.Diese Syntax wird von POSIX nicht definiert, wurde jedoch für SUS-Problem 7 akzeptiert .
quelle
Ich zu erklären , bevorzugt
$IFS
über Beispiel:Suppsoe Sie wollen cp oder mv oder eine andere Datei verarbeitend, IFS leer von defualt ist, wenn Sie Ihre Dateien Meta - Zeichen oder Platz haben , wie zum Beispiel:
Linux Administration.pdf
oderFree Software Fundation.ogg
, sicher werden Sie probelm haben, denn: Linux ein betrachten Separater Parameter und Administartion betrachten einen separaten Parameter. So hat Bashbuilt-in variable
, dann können Sie initialisierenIFS==$(echo -en "\n\b")
, dann Bash verwerfen alle Metazeichen und Leerzeichen zwischen Dateinamen, zum Beispiel:quelle