Die IFS - Variable wird jedes Mal die Shell führt eine Aufgabe genannt verwendet Wörter aufgespalten . Die häufigsten Fälle, in denen dies verwendet wird, sind nach der Parametererweiterung (z. B. $var
) oder der Befehlssubstitution (z. B. $(some-command)
oder den veralteten Backticks) in einem Befehl. Wenn die Erweiterung IFS
Zeichen enthält , wird sie vor der Verarbeitung des Befehls in verschiedene Wörter aufgeteilt. Tatsächlich bedeutet dies, dass diese Zeichen den ersetzten Text in verschiedene Argumente aufteilen (einschließlich des Namens des Befehls, wenn die Variable zuerst angegeben wird).
Der Grund für den Standardwert IFS
Leerzeichen, Tabulator und Zeilenumbruch ist daher, dass dies die Leerzeichen sind, von denen normalerweise erwartet wird, dass sie ein Wort teilen.
Eine Möglichkeit, das Aufteilen von Wörtern zu verhindern, besteht darin, die Erweiterung ( "$var"
) in doppelte Anführungszeichen zu setzen - tatsächlich haben Sie dies in Ihrer Frage getan. Wenn Sie dies nicht tun würden, gäbe es keine Ausgabe von, echo
da es keine Argumente hätte, sondern nur Zeichen, die Argumente aufteilen.
Beachten Sie auch, dass zwei Stellen, an denen nach der Parametererweiterung keine Wortaufteilung stattfindet, mit variabler Zuweisung (z. B. var=$othervar
und var=$(somecommand)
in Ordnung) und innerhalb des [[ ]]
Konstrukts ( [[ $var = $othervar ]]
in Ordnung, aber [ $var = $othervar ]
in Anführungszeichen gesetzt) sind.
Schließlich ist, wie ein weiser Mann mir einmal sagte, ein häufiges Missverständnis, dass die Verhinderung der Wortteilung der einzige Grund ist, eine Variable zu zitieren. Ist dies nicht der Fall, verhindert das Zitieren auch die Erweiterung von Pfadnamen oder Globs, wie es allgemein bekannt ist. Wenn eine Variable Glob-Zeichen wie *
diese enthält, können diese zu Dateinamen erweitert werden, wenn die Variable in einem Befehl ohne Anführungszeichen verwendet wird. Betrachten Sie zB:
var=*
echo $var
Dadurch werden die Namen der Dateien im aktuellen Verzeichnis angezeigt.
Wie Stephane weiter unten ausführt , ist die Reihenfolge der Zeichen IFS
beim Erweitern von Bedeutung "$*"
. Von der bash
Manpage:
"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable. If IFS is unset, the parameters are separated by spaces. If
IFS is null, the parameters are joined without intervening separators.
Weitere Beispiele für die Wortteilung finden Sie in dieser Antwort: /unix//a/118444/48083
$IFS
wird auch verwendet"$*"
, weshalb die Reihenfolge wichtig ist.zsh
das NUL-Zeichen standardmäßig enthalten ist$IFS
(andere Shells unterstützen das Halten des NUL-Zeichens in ihren Variablen nicht).