[BASH] Utiliser le contenu d'une variable pour créer une variable?

Utiliser le contenu d'une variable pour créer une variable? [BASH] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 26-05-2009 à 11:45:46    

Voila le bout de mon script, avec en commentaires mon objectif.
 

Citation :

#!/bin/bash
########################################
# Test original actuellement en prod ###
########################################
MOUNT=`which mount 2>/dev/null`
NAIL=`which nail 2>/dev/null`
UMOUNT=`which umount 2>/dev/null`
RSYNC=`which rsync 2>/dev/null`
if [ -z ${MOUNT} ]; then unavailable "mount" EXIT; fi
if [ -z ${NAIL} ]; then unavailable "nail" EXIT; fi
if [ -z ${UMOUNT} ]; then unavailable "umount" EXIT; fi
if [ -z ${RSYNC} ]; then unavailable "rsync" EXIT; fi
 
 
################################################
# Avec la boucle for, ce que j'ESSAI de faire ##
################################################
LIST="mount umount rsync nail"
for VAR in ${LIST} do
VAR=`echo "${VAR}"|tr '[:lower:]' '[:upper:]'`                                         #Toutes les variables en majuscules
${VAR}=`which ${VAR} 2>/dev/null`                                                    #Vérifie la présence du soft
# Objectif ${VAR} doit être en faite MOUNT pour le premier tour de boucle, voir ci dessous
# MOUNT=`which ${VAR} 2>/dev/null`
 if [ -z ${MOUNT} ]; then mafonction "${VAR}" EXIT; fi
 export MOUNT                                                                                # Export OBLIGATOIRE, c'est bien la le soucis.
# Evidement à la place de ${MOUNT} on doit avoir consécutivement ${UMOUNT} ${RSYNC} et enfin ${NAIL}
done


 
 
Merci d'avance!
 
Pour info, ni {!VAR} ni $${VAR} ne font ce que je veux.
 
Edit: Et je sais qu'il existe une méthode propre et rapide pour le faire, mais impossible de retrouver.


Message édité par mdvore le 26-05-2009 à 12:21:56
Reply

Marsh Posté le 26-05-2009 à 11:45:46   

Reply

Marsh Posté le 26-05-2009 à 11:57:24    

Et en faisant un truc du genre VAR_${VAR} [:opus dei] [:mrbrelle]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 26-05-2009 à 12:04:03    

Pourquoi pas, je pense que cela peut marcher, mais c'est pas exactement le bon résultat :o

Reply

Marsh Posté le 26-05-2009 à 12:08:14    

Et sa marche pas :o
 

Citation :


#!/bin/bash
LIST="mOUnt UMount RSYNc nail"
for VAR in ${LIST}
do
  echo ${VAR}
  VAR=`echo "${VAR}"|tr '[:lower:]' '[:upper:]'`
  VAR_${VAR}=salut
  echo ${VAR}
  echo ${VAR_$VAR}
done


 
adrien@adrien-laptop:~$ ./toto
mOUnt
./toto: line 7: VAR_MOUNT=salut : commande introuvable
MOUNT
./toto: line 9: ${VAR_$VAR} : mauvaise substitution

Reply

Marsh Posté le 26-05-2009 à 12:25:01    

mdvore a écrit :

Et sa marche pas :o


 
tu ne sais pas écrire un script, c'est différent.
 
Je ne saurais que trop te conseiller de lire le man de bash à ce sujet


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 26-05-2009 à 12:36:29    

Reply

Marsh Posté le 26-05-2009 à 12:52:15    

mdvore a écrit :

Et sa marche pas :o

 

euh non mais là ... :sweat:

Code :
  1. #!/bin/bash
  2. LIST="mOUnt UMount RSYNc nail"
  3. for VAR in ${LIST}
  4. do
  5.  UVAR=$(echo "${VAR}" | tr '[:lower:]' '[:upper:]')
  6.  LVAR=$(echo "${VAR}" | tr '[:upper:]' '[:lower:]')
  7.  VAR_${UVAR}=$(which ${LVAR})
  8.  echo "${LVAR} -> ${VAR_${UVAR}}"
  9. done
 

p'tet qu'en scriptant correctement ça irait mieux déjà quoi :o


Message édité par wedgeant le 26-05-2009 à 12:56:30

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 26-05-2009 à 12:52:40    

black_lord a écrit :


 
tu ne sais pas écrire un script, c'est différent.
 
Je ne saurais que trop te conseiller de lire le man de bash à ce sujet


 
Et oui, on est pas expert en 2min... Je débute effectivement.

Reply

Marsh Posté le 26-05-2009 à 13:55:10    

Merci mais j'ai trouvé mieux en faite :)
 

Code :
  1. LIST="mount"
  2. for VAR in ${LIST}; do
  3.   MAJ=`echo "${VAR}"|tr '[:lower:]' '[:upper:]'` #Commande en MAJ
  4.   MIN=`echo "${VAR}"|tr '[:upper:]' '[:lower:]'` #Commande en min
  5.   WHICH=`which ${MIN} 2>/dev/null`
  6. if [ -z ${MAJ} ]; then unavailable "${MIN}" EXIT; fi
  7. eval "export ${MAJ}=${WICH}"
  8. done
  9. echo $MOUNT


 
Me retourne bien que $MOUNT --> /bin/mount
 
Merci ;)

Reply

Marsh Posté le 26-05-2009 à 14:04:52    

[:mlc]
 
j'sais pas moi ... mais ça ressemble quand même énormément à ce que je t'ai proposé, mais en moins bien ... après tu fais comme tu veux hein [:elessar53]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 26-05-2009 à 14:04:52   

Reply

Marsh Posté le 26-05-2009 à 15:03:34    

Oui effectivement Wedge, j'ai posté sans avoir lu avec attention ton script car j'avai déja trouvé la soluce a ma question :jap:
 
Je vais observer pour améliorer ducoup :)

Reply

Marsh Posté le 28-05-2009 à 02:25:45    

Bon, on sort du bash mais voila une solution courte et concise de le faire en perl :
 

Code :
  1. perl -e '($_)=lc and print $_ ." -> " .`which $_` for @ARGV;' DF Cp lS

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed