Je souhaite créer dynamiquement une séquence de chaînes en manipulant un tableau d'éléments et en créant une procédure arithmétique.
for name in FIRST SECOND THIRD FOURTH FIFTH; do
$name = $(( $6 + 1 ))
$name = "${$name}q;d"
echo "${$name}"; printf "n"
done
Le résultat souhaité serait le suivant pour $6
est égal à .
1q;d
2q;d
3q;d
4q;d
5q;d
Mais j'obtiens cette erreur
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
Je suppose que c'est quelque chose de simple. Cela fonctionnait quand je faisais quelque chose comme
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
Réponse acceptée :
Tout d'abord il ne peut pas y avoir d'espace autour de =
dans la déclaration de variable dans bash
.
Pour obtenir ce que vous voulez, vous pouvez utiliser eval
.
Par exemple un exemple de script comme le vôtre :
#!/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
Impressions :
1q;d
2q;d
3q;d
4q;d
5q;d
Utilisez eval
avec prudence, certaines personnes appellent cela le mal pour une raison valable.
declare
fonctionnerait aussi :
#!/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
imprime également :
1q;d
2q;d
3q;d
4q;d
5q;d