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.
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
@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). –
Encore Dennis remercie un groupe pour votre aide. Je vais regarder par-dessus votre suggestion. – spaghettiwestern