Ich habe angefangen, Bash-Scripting zu lernen und verwende das Bash-Scripting-Tutorial
Dort steht es
Bevor Bash jede Zeile unseres Skripts interpretiert (oder ausführt), prüft es zunächst, ob Variablennamen vorhanden sind . Für jede identifizierte Variable wird der Variablenname durch seinen Wert ersetzt. Dann wird diese Codezeile ausgeführt und der Vorgang in der nächsten Zeile erneut gestartet.
Läuft Bash also zuerst das gesamte Skript durch, um Variablen zu finden? Ich bin mir nicht sicher, ob der Autor dies versucht hat, aber wenn ja, denke ich, ist es nicht korrekt?
wenn ich ausführe:
#!/bin/bash
echo "hello $USERR"
USERR=John
Ich bekomme hello
als Ergebnis.
Wenn ich renne:
#!/bin/bash
USERR=John
echo "hello $USERR"
dann bekomme ich hello John
als Ergebnis.
--
und nicht auf Fehler von Befehlen zu prüfen ...). Sicherheitsimplikationen des Vergessens, eine Variable in Bash / POSIX-Shells zu zitierenAntworten:
Nee. Wie Sie selbst in Ihrem Beispiel festgestellt haben, werden Bash-Skripte von oben nach unten ausgeführt.
Es empfiehlt sich, alle Variablen, die Sie benötigen, oben in Ihrem Skript zu definieren.
quelle
x=1; x=2 echo "$x"
druckt,1
weil$x
es ersetzt wird, bevorx=2 echo "$x"
es ausgeführt wird.Das ist eine sehr schlampige Art zu sagen, dass die Shell jeden Befehl nach Erweiterungen durchsucht, wie zum Beispiel Variablen (aber auch Befehlsersetzungen usw.).
Der Text könnte so interpretiert werden, dass die Shell das gesamte Skript liest und vor der Ausführung in jeder Zeile nach Variablen sucht. Das ist nicht so. Es verarbeitet das Skript Befehl für Befehl, nicht Zeile für Zeile. Ein Befehl kann mehrere Zeilen umfassen. Ein Befehl wird erst verarbeitet, wenn der Shell-Interpreter ihn bei der Ausführung des Skripts erreicht.
Die
bash
Shell führt mit jedem Befehl Folgendes aus, bevor er ausgeführt wird:quelle
;
,||
oder&&
), sind sie erweitert und einer nach dem anderen ausgeführt. Wird daherfoo="some value"; echo "$foo"
gedruckt,some value
da der Verweis auf$foo
erst erweitert wird, nachdem der Zuweisungsbefehl ausgeführt wurde. Übrigens können Befehle auch durch getrennt werden&
, aber das ist ein Sonderfall. Damit wird der erste Befehl im Hintergrund ausgeführt, sodass der zweite Befehl nicht darauf wartet, dass er beendet wird.