2010-09-11 14 views
3

Shell Building et le référencement, j'ai un shell qui fonctionne où les variables d'environnement prédéfinies comprennent:Bourne une variable

FOOCOUNT=4 
FOO_0=John 
FOO_1=Barry 
FOO_2=Lenny 
FOO_3=Samuel 

Je ne peux pas changer la façon dont je reçois ces données.

Je souhaite exécuter une boucle qui génère la variable et utilise le contenu.

echo "Hello $FOO_count" 

Cette syntaxe est cependant mal et qui est ce que je cherche ...

count=$FOOCOUNT 
counter=0 
while [ $counter -lt $count ] 
do 
#I am looking for the syntax for: <<myContructedVar= $ + 'FOO_' + $counter>> 
counter=`expr $counter + 1` 
echo "Greeting #$counter: Hello, ${myContructedVar}." 
done 

Merci beaucoup

Répondre

2

la clé est eval:

count=$FOOCOUNT 
counter=0 
while [ $counter -lt $count ] 
do 
    myConstructedVar=FOO_$counter 
    counter=`expr $counter + 1` 
    echo "Greeting #$counter: Hello, `eval echo \$${myConstructedVar}`." 
done 

L'arithmétique de boucle est old school - la façon dont j'écris le code. Les obus modernes ont plus d'arithmétique intégré - mais la question est étiquetée Bourne shell.

+0

C'est parfait. Je n'étais pas familier avec eval mais eval myVar = \ $$ {myConstructedVar} a fonctionné parfaitement. Merci beaucoup! –

0

Il a été un temps très long depuis que je l'ai fait tout Bourne shell mais avez-vous essayé la commande eval?

1

Vous aurez besoin d'un eval et un Sigil différé:

$ foo_0=john 
$ count=0  
$ name="\$foo_$count" 
$ echo $name 
$foo_0 
$ eval echo "$name"  
john 

mais à moins que l'indice est vraiment important pour vous, vous pouvez utiliser

for i in "$foo_0" "$foo_1" "$foo_2" ... ; do 
... 
done 

et se débarrasser des pseudo mal nommé -array. Et, si vous avez une limite supérieure sur le nombre de foo_xet il n'y a pas de caractères spéciaux dans les différents foos (en particulier aucun caractère dans $IFS par défaut <space><tab><return>) alors vous pouvez utiliser la fonctionnalité d'effondrement d'argument nul de la coquille et:

$ for i in $foo_0 $foo_1 $foo_2 ; do 
> echo '***' $i 
> done 
*** john 

et permettre à la coque d'ignorer unset foo_x