Je veux créer dynamiquement une séquence de chaînes en manipulant un tableau d'éléments et créer 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 ci-dessous pour les $6
égaux 0
.
1q;d
2q;d
3q;d
4q;d
5q;d
Mais je reçois 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. Ça fonctionnait quand je faisais quelque chose comme
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"
FIRST=$(( $6 + 1 ))
Réponses:
Tout d'abord, il ne peut y avoir d'espace autour
=
de la déclaration de variable dansbash
.Pour obtenir ce que vous voulez, vous pouvez l’utiliser
eval
.Par exemple, un exemple de script comme le vôtre:
Tirages:
Utilisez
eval
avec prudence, certaines personnes l'appellent mal pour une raison valable.declare
fonctionnerait aussi:imprime également:
la source
!
point d'exclamationprintf '%s\n' "${!name}"
?bash
paramètresdeclare
/eval
:printf -v varname '%fmt' args
. Certaines fonctions internes de complétion de bash l'utilisent pour l'appel par référence. (passez le nom d'une variable dans laquelle stocker).declare
définit uniquement la variable dans la portée locale, tandis que l'eval
approche la définit globalement.Si vous souhaitez référencer une variable bash tout en ayant le nom stocké dans une autre variable, vous pouvez le faire comme suit:
Vous stockez le nom de la variable à laquelle vous souhaitez accéder dans, disons, var2 dans ce cas. Ensuite, vous y accédez avec
${!<varable name>}
où se<variable name>
trouve une variable contenant le nom de la variable à laquelle vous souhaitez accéder.la source
eval var=\$$holder
maiseval
dangereux!C'est ça que vous essayez?
la source
Ce que j'obtiens de votre code et de votre sortie souhaitée (corrigez-moi si je me trompe):
Il n'y a pas d'utilisation des noms de variables "FIRST" / "SECOND" / ..., vous avez juste besoin d'une boucle avec un index .. .
Cela fera le travail:
for i in {1..5} ; do echo $i"q;d" ; done
la source
SUM=$(($6 + $i)); echo $SUM"q;d"
, Je vois ce que je faisais mal.