Ich möchte dynamisch eine Folge von Zeichenfolgen erstellen, indem ich ein Array von Elementen manipuliere und eine arithmetische Prozedur erstelle.
for name in FIRST SECOND THIRD FOURTH FIFTH; do
$name = $(( $6 + 1 ))
$name = "${$name}q;d"
echo "${$name}"; printf "\n"
done
Das Wunschergebnis wäre für $6
Gleichgestellte das Folgende 0
.
1q;d
2q;d
3q;d
4q;d
5q;d
Aber ich bekomme diesen Fehler
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
Ich denke, es ist etwas Einfaches. Früher hat es funktioniert, als ich so etwas gemacht habe
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
FIRST=$(( $6 + 1 ))
Antworten:
Erstens darf
=
in der Variablendeklaration in kein Leerzeichen enthalten seinbash
.Um zu bekommen, was Sie wollen, können Sie verwenden
eval
.Zum Beispiel ein Beispielskript wie das Ihre:
Drucke:
Verwenden Sie
eval
vorsichtig, rufen manche Leute es übel aus irgendeinem triftigen Grund.declare
würde auch funktionieren:druckt auch:
quelle
!
Ausrufezeichenprintf '%s\n' "${!name}"
?bash
Parametererweiterungdeclare
/eval
:printf -v varname '%fmt' args
. Einige interne Funktionen für die Bash-Vervollständigung verwenden diese Funktion als Referenz. (Übergeben Sie den Namen einer Variablen, in der gespeichert werden soll).declare
nur verwenden, wird die Variable im lokalen Bereich festgelegt, während dereval
Ansatz sie global festlegt.Wenn Sie eine Bash-Variable referenzieren möchten, während der Name in einer anderen Variablen gespeichert ist, können Sie dies wie folgt tun:
In diesem Fall speichern Sie den Namen der Variablen, auf die Sie zugreifen möchten, beispielsweise in var2. Dann greifen Sie darauf zu,
${!<varable name>}
indem Sie angeben, wo<variable name>
sich eine Variable befindet, die den Namen der Variablen enthält, auf die Sie zugreifen möchten.quelle
eval var=\$$holder
abereval
gefährlich!Versuchen Sie das?
quelle
Was ich von Ihrem Code und Ihrer gewünschten Ausgabe bekomme (korrigieren Sie mich, wenn ich falsch liege): Die
Variablennamen "FIRST" / "SECOND" / ... werden nicht verwendet, Sie benötigen nur eine Schleife mit einem Index. .
Das erledigt die Arbeit:
for i in {1..5} ; do echo $i"q;d" ; done
quelle
SUM=$(($6 + $i)); echo $SUM"q;d"
Ich sehe, was ich falsch gemacht habe.