Was ist los mit diesem Skript? Ich versuche A1 = 1, B1 = 1, C1 = 1 zu definieren
LIST="A B C"
for x in $LIST
do
"$x"1=1
done
und das Ergebnis ist:
./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found
shell-script
variable
Ake Blomberg
quelle
quelle
eval "$x"1=1
. Obwohl, wie Jakuje bemerkte, Arrays wahrscheinlich besser für diesen Fall geeignet sind.Antworten:
Eine Variablenzuweisung hat die Form eines Variablennamens, gefolgt vom Gleichheitszeichen, gefolgt vom (optionalen) Wert.
Dies ist eine gültige Zuordnung:
"$x"1=1
ist keine gültige Zuordnung, da"$x"1
es sich nicht um einen Variablennamen handelt. Es kann sein , eval uated zu einem Variablennamen, aber es ist nicht. Die Shell glaubt tatsächlich, dass es ein Befehl ist.Eine Möglichkeit, das zu tun, was Sie erreichen möchten, ist folgende:
Ein anderer Weg in Bash (aber nicht in anderen Shells) ist:
Oder auch (wieder nur Bash):
(In Ihrem Fall gibt es keinen großen Unterschied.)
Aber, wie Jakuje in den Kommentaren bemerkte , möchten Sie wahrscheinlich mit Arrays arbeiten, wenn Ihre Shell diese hat (ksh, bash oder zsh).
Zur Vollständigkeit:
eval
führt beliebige Befehle aus. Wenn Sie also auf der rechten Seite des Gleichheitszeichens eine Variable haben, die zu einem Befehl erweitert wird, wird dieser Befehl ausgeführt. Der folgende Code:ist äquivalent zu
a=hello
.declare
ist eine integrierte Bash zum Zuweisen von Variablen und führt keinen Befehl aus. Der folgende Code:ist äquivalent zu
a='$(echo hello)'
.let
ist insofern ähnlichdeclare
, als es keine Befehle ausführt. Aber im Gegensatz zudeclare
,let
kann für arithmetische Operationen verwendet werden:ist äquivalent zu
a=3
.quelle
ABC = 123
ist ungültig. Weil vor und nach demequal(=)
Schild Platz hinzugefügt wird .Die Bash-FAQ enthält einen Eintrag zur Indirektion. In den meisten Anwendungsfällen sollten Sie tatsächlich ein assoziatives oder indiziertes Array verwenden. Sie können auch verwenden
In diesem FAQ-Eintrag finden Sie weitere Optionen, während Sie dennoch unordentliche
eval
Zitate vermeiden .quelle
Sie können folgenden Code verwenden. In Ihrer Code-Shell wird
"$x"1=1
als Befehl ausgeführt, da es sich nicht um eine gültige Variablenzuweisung handelt.quelle
command not found <varname>=1
wenn ich das versuche (offensichtlich mit <varname> als dem Wert, in dem ich gespeichert habea
)echo
hier nicht! Einfacha="$x"1
. Ist auchlet
ein arithmetischer Kontext, so dass Sie ihm nur Zahlen zuweisen können.declare $a=foobar
funktioniert.