Wenn die Shell eine Zeile analysiert, wird die Zeile in Wörter unterteilt, verschiedene Erweiterungen (in der angegebenen Reihenfolge) für die Wörter ausgeführt und anschließend der Befehl ausgeführt.
Annehmen test=1:2:3:4:5:6
Schauen wir uns diesen Befehl an: IFS=":" read a b c d e f <<< "$test"
Nach dem Tokenisieren und der Parametererweiterung :IFS=":"
read
a
b
c
d
e
f
<<<
"1:2:3:4:5:6"
Die Shell legt die IFS-Variable für die Dauer des Lesebefehls fest und read
weiß, wie $ IFS auf ihre Eingabe angewendet wird , und gibt den Variablennamen Werte.
Dieser Befehl hat eine ähnliche Geschichte, aber ein anderes Ergebnis: HOME="hello" echo "$HOME"
Da die Parametererweiterung vor Beginn des Befehls erfolgt, hat die Shell:
HOME="hello" echo "/home/username"
Und dann wird während der Ausführung des Echo-Befehls der neue Wert von $ HOME überhaupt nicht verwendet.
Wählen Sie eine der Optionen aus, um das zu erreichen, was Sie versuchen
# Delay expansion of the variable until its new value is set
HOME="hello" eval 'echo "$HOME"'
oder
# Using a subshell, so the altered env variable does not affect the parent.
# The semicolon means that the variable assignment will occur before
# the variable expansion
(HOME="hello"; echo "$HOME")
aber wähle nicht den ersten aus.
local
.