Voglio creare dinamicamente una sequenza di stringhe manipolando un array di elementi e creando una procedura aritmetica.
for name in FIRST SECOND THIRD FOURTH FIFTH; do
$name = $(( $6 + 1 ))
$name = "${$name}q;d"
echo "${$name}"; printf "n"
done
Il risultato desiderato sarebbe il seguente per $6
è uguale a .
1q;d
2q;d
3q;d
4q;d
5q;d
Ma ricevo questo errore
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
Immagino sia qualcosa di semplice. Funzionava quando facevo qualcosa del tipo
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
Risposta accettata:
Innanzitutto non può esserci spazio intorno a =
nella dichiarazione di variabile in bash
.
Per ottenere ciò che desideri puoi utilizzare eval
.
Ad esempio uno script di esempio come il tuo :
#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
eval "$name"="'$(( $i + 1 ))q;d'"
printf '%sn' "${!name}"
i=$(( $i + 1 ))
done
Stampe :
1q;d
2q;d
3q;d
4q;d
5q;d
Usa eval
con cautela, alcune persone lo chiamano male per qualche motivo valido.
declare
funzionerebbe anche :
#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
declare "$name"="$(( $i + 1 ))q;d"
printf '%sn' "${!name}"
i=$(( $i + 1 ))
done
stampa anche :
1q;d
2q;d
3q;d
4q;d
5q;d