Ich bin gerade auf mehrere Antworten gestoßen, z. B. zum Analysieren einer Textdatei mit Trennzeichen … die das Konstrukt verwenden:
while IFS=, read xx yy zz;do
echo $xx $yy $zz
done < input_file
wo der IFS
Variable wird vor read
gesetzt Befehl.
Ich habe die Bash-Referenz gelesen, kann aber nicht herausfinden, warum dies legal ist.
Ich habe es versucht
$ x="once upon" y="a time" echo $x $y
von der Bash-Eingabeaufforderung, aber es wurde nichts zurückgegeben. Kann mir jemand zeigen, wo diese Syntax in der Referenz definiert ist, die es ermöglicht, die IFS-Variable auf diese Weise festzulegen? Handelt es sich um einen Sonderfall oder kann ich etwas Ähnliches mit anderen Variablen machen?
Akzeptierte Antwort:
Relevante Informationen finden Sie auf der vom BASH-Betreuer bereitgestellten Manpage (zuletzt überprüft im August 2020). Abschnitt Shell-Grammatik, Einfache Befehle heißt es (Hervorhebung hinzugefügt):
Ein einfacher Befehl ist eine Folge optionaler Variablenzuweisungen gefolgt von durch Leerzeichen getrennten Wörtern und Weiterleitungen , und durch einen Kontrolloperator beendet. Das erste Wort gibt den auszuführenden Befehl an und wird als Argument Null übergeben. Die restlichen Wörter werden als Argumente an den aufgerufenen Befehl übergeben.
Sie können also jede beliebige Variable übergeben. Ihr echo
Beispiel funktioniert nicht, da die Variablen an den Befehl übergeben und nicht in der Shell festgelegt werden. Die Shell expandiert $x
und $y
vorher Aufruf des Befehls. Das funktioniert zum Beispiel:
$ x="once upon" y="a time" bash -c 'echo $x $y'
once upon a time