2010-09-29 4 views
1

Le if [ {$i[0]} = "true" ] ci-dessous est défaillant. Je n'arrive pas à comprendre comment obtenir la mise en forme correcte pour {$i[0]} dans l'instruction if.Bash pour la boucle si le nom du tableau d'instructions référencé comme variable

#!/bin/bash 
foo=bar1,bar2 

for i in ${foo//,/" "} 
do 
declare -a ${i}='(true null null null)' 
done 

for i in ${foo//,/" "} 
do 
if [ {$i[0]} = "true" ] 
then echo "yes" 
eval "echo \${$i[*]}" 
else echo "no" 
fi 
done 

J'ai eu un peu de problème connexe que quelqu'un a eu la gentillesse de me aider avec Bash echo all array members when array is referenced as a variable in a loop

Merci pour toute aide!

Répondre

2

Vous allez devoir utiliser eval ici aussi, mais je recommanderais une autre conception générale.

if [ "$(eval "echo \${$i[0]}")" = "true" ] 

Edit:

Proposition de refonte (utilise un scénario imaginaire extrapolé à partir du peu que je l'ai vu de ce que vous faites):

#!/bin/bash 
# sample input: $1=foo,bar,baz 
saveIFS=$IFS 
IFS=','  # word splitting will be done using a comma as the delimiter 
names=($1) # store the names for cross reference or indirection 
IFS=$saveIFS 

# Constants: 
declare -r heater=0 
declare -r exhaust=1 
declare -r light=2 
declare -r rotation=3 

# deserialize and serialize: 

# initialize settings 
for ((i=0; i<${#names}; i++)) 
do 
    declare ${names[i]}=$i # setup indirection pointers 
    config[i]="null null null null" 
done 

# by index: 
vals=(${config[0]})  # deserialize 
echo ${vals[light]}  # output value 
vals[light]="false"  # change it 
config[0]=${vals[@]}  # reserialize 

# by name: 
vals=(${config[$foo]}) 
echo ${vals[light]}  # output value 

# by indirection: 
vals=(${config[${!names[0]}]}) 
echo ${vals[light]}  # output value 

# iteration using indirection 
for name in ${names[@]} 
do 
    echo "Configuration: $name" 
    echo " all settings: ${config[${!name}]}" 
    vals=(${config[${!name}]}) 
    for setting in heater light # skipping exhaust and rotation 
    do 
     echo " $setting: ${vals[${!setting}]}" 
    done 
done 

Cela peut donner vous quelques idées et principes que vous pouvez utiliser. Si vous utilisez Bash 4, vous pouvez utiliser des tableaux associatifs qui simplifieraient grandement ce type de choses. Vous pouvez également utiliser des fonctions pour simplifier.

+0

Cela a fonctionné grâce. Qu'avez-vous en tête en tant que design différent? Je suis tout ouïe. Je sais que vous avez parlé d'utiliser des chaînes plutôt que des tableaux. Est-ce que votre idée est de faire 'bar1 = true, null, null, null' et d'utiliser" Shell Parameter Expansion "comme avec $ {foo //, /" "}' pour lire, écrire et modifier mes paramètres stockés? – spaghettiwestern

+0

@spaghettiwestern: Voir mon edit pour quelques idées. Il vaut mieux éviter 'eval' si vous le pouvez pour [raisons de sécurité] (http://mywiki.wooledge.org/BashFAQ/048). –

+0

Encore Dennis remercie un groupe pour votre aide. Je vais regarder par-dessus votre suggestion. – spaghettiwestern

Questions connexes