2 votes

Bash SH - Définir un nouveau nom de var en incluant dans ce nom une autre var

J'ai juste besoin de créer un nom de var incrémental à l'intérieur d'une boucle. La variable doit utiliser "dans le nom de la var le numéro du cycle".

Exemple à l'intérieur d'une boucle :

# on Cycle=1
MyVar$Cycle=Exec$Cycle   # (equal to MyVar1=Exec1)

# on Cycle=2
MyVar$Cycle=Exec$Cycle   # (equal to MyVar2=Exec2)

# etc...

Comment puis-je définir correctement le nom de la variable ?

La mise en lot fonctionne facilement :

set MyVar%Cycle%=Exec%Cycle% ...

Mais je ne sais pas comment faire pour que cela se produise dans Bash.

Bien sûr, attacher comme ça MyVar$Cycle=Exec$Cycle ne fonctionnent pas.

J'ai juste besoin de pouvoir définir ce varname incrémentiel pour pouvoir leur donner les valeurs dont j'ai besoin au fur et à mesure. Pour moi, le script fonctionne très bien mais la définition d'un nouveau nom de var en temps réel ne fonctionne pas.

2voto

pa4080 Points 27038

Une façon possible de résoudre cette tâche est d'utiliser la commande eval d'une manière comme celle-ci :

#!/bin/bash

for i in {1..5}
do
        eval "var$i"="$i"
done

# Output the result
for i in {1..5}
do
        echo -n "\$var$i : "
        eval echo "\$var$i"
done

Exemple de sortie :

$ ./cycle.sh
$var1 : 1
$var2 : 2
$var3 : 3
$var4 : 4
$var5 : 5

Cependant, je pense qu'il est préférable d'adapter votre script pour qu'il fonctionne avec tableaux afin d'éviter de telles magies :

#!/bin/bash

for i in {1..5}
do
        array["$i"]="$i"
done

# Output the result
for i in {1..5}
do
        echo "\$array[$i]" : "${array[$i]}"
done

Exemple de sortie :

$ ./cycle.sh
$array[1] : 1
$array[2] : 2
$array[3] : 3
$array[4] : 4
$array[5] : 5
  • Remarque : par défaut, le premier indice dans un tableau Bash est le suivant [0] pas [1] .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X