Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 11-05-2017 16:50:44

Bipbip41
Membre
Inscription : 15-08-2016

Problème avec variable composée elle-même avec un nom de variable

Bonjour à tous,

Pour mon travail, je souhaite réaliser un script en shell pour effectuer des actions sur plusieurs serveurs. Même si certaines actions resteront les mêmes pour tous, certaines autres diffèrent d'un serveur à l'autre.

J'aimerai aussi qu'il me pose les questions dès le début, pour ne plus y revenir pendant qu'il traite toutes les actions.

Pour se faire, je créé des variables composés du nom de l'action, puis du nom du serveur.

Sauf que, impossible de faire des echo des valeurs, et encore moins de les mettre dans un if. J'ai essayé tout un tas de syntaxe différentes, avec des !, des parenthèses, des acolades, etc, sans succès.

Voici un extrait du code :

date=`date +%Y-%m-%d_%H:%M`
date_reboot=`date +%Y-%m`
neutre='\e[0;m'
jaune='\e[1;33m'
cyanfonce='\e[0;36m'
rouge='\e[0;31m'
tws="y"

set -x

echo -e "${cyanfonce}Liste des serveurs (séparés par des espaces) : ${neutre} \c"
IFS=' '
read -a list_servers


for (( i=0; i<${#list_servers[@]}; i++ )) do


echo -e "${cyanfonce}Pour ${list_servers[$i]}, faut-il passer une commande avant le reboot ? ${neutre} \c"
read b_command_${list_servers[$i]}

echo -e "${cyanfonce}Pour ${list_servers[$i]}, faut-il passer une commande après le reboot ? ${neutre} \c"
read a_command_${list_servers[$i]}

if [[  a_command_${list_servers[$i]} = "y" ]]
then

done


Et voici un set -x pour comprendre le problème :

+ echo -e '\e[0;36mListe des serveurs (séparés par des espaces) : \e[0;m \c'
Liste des serveurs (séparés par des espaces) :  + IFS=' '
+ read -a list_servers
toto
+ (( i=0 ))
+ (( i<1 ))
+ echo -e '\e[0;36mPour toto, faut-il passer une commande avant le reboot ? \e[0;m \c'
Pour toto, faut-il passer une commande avant le reboot ?  + read b_command_toto
echo
+ echo -e '\e[0;36mPour toto, faut-il passer une commande après le reboot ? \e[0;m \c'
Pour toto, faut-il passer une commande après le reboot ?  + read a_command_toto
echo super
+ [[ a_command_toto = \y ]]
+ (( i++  ))
+ (( i<1 ))
 



On voit qu'il ne lis pas la variable a_command_toto, mais se contente de faire un echo comme si c'était du texte.

Si vous avez une idée, je suis dessus depuis 3h smile

Merci

Edit à toto :
Mis les balises code de Autre code puisque ce sont des retours de commandes et non la commande elle-même. Plus lisible ainsi, non ?

Hors ligne

#2 11-05-2017 21:41:10

vv222
Modérateur
Lieu : Bretagne
Distrib. : GNU/Linux Debian « Sid »
Noyau : >= Linux 4.13 (amd64)
(G)UI : Openbox + ROX
Inscription : 18-11-2013
Site Web

Re : Problème avec variable composée elle-même avec un nom de variable

Pour réaliser ce que tu vises, tu peux utiliser eval.
Tu peux trouver quelques exemples dans le fichier suivant, aux lignes 55, 74, 76, 77 et 78 :
https://git.debian-fr.xyz/vv222/play.it … archive.sh

Dans l’exemple que tu donnes, ça fait :

if [[  $(eval echo \$a_command_${list_servers[$i]}) = "y" ]]



eval va d’abord interpréter la commande qui lui est donnée en argument, c’est-à-dire :

echo \$a_command_${list_servers[$i]}


Ce qui aura pour résultat :

$a_command_toto



Puis dans ton code le contenu de $(…) sera remplacé par son résultat, avant que le code soit interprété une dernière fois, sous la forme :

if [[ $a_command_toto  = "y" ]]

Dernière modification par vv222 (11-05-2017 21:48:11)


Jouer sous Debian ? Facile !

Hors ligne

#3 11-05-2017 22:28:36

Bipbip41
Membre
Inscription : 15-08-2016

Re : Problème avec variable composée elle-même avec un nom de variable

Génial !! big_smile

Ca fonctionne impec, c'est exactement ce que je cherchais à faire

Merci beaucoup pour ton aide smile

Hors ligne

#4 11-05-2017 22:49:13

otyugh
Membre
Lieu : Quimperlé/Arzano
Distrib. : Debian Stable
Inscription : 20-09-2016

Re : Problème avec variable composée elle-même avec un nom de variable

Tu sembles vouloir une "variable de variable".
EDIT : par contre c'est propre à Bash, y a pas de ça dans Dash (sh).

$ animal=lapin
$ read mon_$animal
sanguinaire

$ tmp=mon_$animal
$ echo ${!tmp}
sanguinaire

Dernière modification par otyugh (11-05-2017 22:54:19)


Agenda du libre : se faire dépanner/dépanner IRL ! Le libre n'est pas qu'un phénomène internet.
Framapad sur les balados : Emissions audio pro/amateur, votre radio sur-mesure !

En ligne

#5 09-11-2017 19:58:20

Bipbip41
Membre
Inscription : 15-08-2016

Re : Problème avec variable composée elle-même avec un nom de variable

Bonsoir à tous,

Je rebondit sur ce sujet. J'ai utilisé la technique de vv222 qui est niquel. Mais j'ai maintenant un autre problème, puisque je veux faire une modif sur le script.

Je souhaite faire un fichier de conf à côté, qui contiendra les variables qui changelent le plus osuvent, pour ne pas obliger l'utilisateur à les renseigner au début du script. Il chargera le fichier de conf qui lui va.


Dans mon script, j'ai renseigné ceci :


sop(){

source /home/conf.txt

}

 



Et dans mon fichier de conf, ceci :

typeset bcommand_${list_servers[0]}="y"
 



Si je fais un echo dans la fonction "sop" de mon script, je récupère bien la variable, mais si je fais un echo en dehors de cette fonction, je ne la récupère plus. En passant une variable avec un format simple, type $server", aucun soucis, je la récupère dans tout le script. Avez-vous une idée ? Pourtant, je ne vide pas la variable entre les 2...

Fonctionne :



sop(){

source /home/conf.txt
echo $(eval echo \$bcommand_${list_servers[$i]})

       }

sop

 



Ne fonctionne pas :



sop(){

source /home/conf.txt


       }

sop

echo $(eval echo \$bcommand_${list_servers[$i]})

 

Dernière modification par Bipbip41 (09-11-2017 20:16:16)

Hors ligne

Pied de page des forums