2008-12-16 8 views
6

je reçois le nom d'une variable de l'utilisateur de script comme premier argument et je fais écho à la valeur de ladite variable à la console:Obtenir le nom d'une variable en entrée et changer la variable avec ce nom

#!/bin/bash 
variablename=$1 
echo "The value of $variablename is: " ${!variablename} 

Cela fonctionne très bien!

Ce que je ne peux pas obtenir de travail est si je veux changer cette variable dans la valeur du deuxième argument de l'utilisateur. Un exemple avec une erreur de syntaxe est:

#!/bin/bash 
variablename=$1 
echo "The value of $variablename is: " ${!variablename} 
echo "I will now try to change the value into $2." 
(!variablename}=$2 
# The above line generates: {!variablename}=2: command not found 

En d'autres termes: S'il est possible, comment puis-je obtenir un nom variables de l'utilisateur et à la fois en lecture (déjà résolu) et écrire à ladite variable?

Répondre

7

J'ai eu un éclair tout d'un coup, minutes après demander de l'aide, et je pense avoir une solution:

#!/bin/bash 
variablename=$1 
echo "The value of $variablename is: " ${!variablename} 
echo "I will now try to change the value into $2." 
eval "$variablename=$2" 
echo "Success! $variablename now has the value ${!variablename}!" 

Il fonctionne. Y a-t-il un meilleur moyen?

+1

Non, eval est la bonne façon de procéder. Vous devrez peut-être vous préoccuper des blancs en $ 2, bien que - et des guillemets simples et doubles et des backslashes. –

+0

Merci de m'avoir affirmé que je suis sur la bonne voie. Je vais faire une validation de paramètre si je crée quelque chose de n'importe quelle valeur de réutilisation. En ce moment, je suis surtout occupé à essayer de comprendre Bash plus en profondeur. :-) –

1

Votre solution fonctionnera mais la variable n'aura cette valeur que dans votre script. Cela n'affectera pas la variable de l'application "appelant". Lorsque vous exécutez un script ou un programme, il engendre un nouveau shell avec une copie de l'environnement. C'est par conception que votre script ne modifie pas les choses comme PATH.

Si vous souhaitez que votre script puisse modifier les variables d'environnement pour le shell appelant, vous devez utiliser source scriptname ou . scriptname. C'est ainsi que fonctionne .bashrc.

+0

Merci pour les informations supplémentaires! "source scriptname" a bien fonctionné pour cela. Pourriez-vous élaborer un peu sur ".scriptname" car je n'ai pas compris cette approche? –

+0

source scriptname est essentiellement le même, mais c'est bash spécifique en utilisant le point au lieu de la source est posix compatible –

+0

La syntaxe est ". Nom_script", pas ".scriptname". La commande dot est synonyme de la commande source. – converter42

Questions connexes