Eu tenho um programa que funciona como um menu. Ele tem uma matriz associativa chamada config
como:
declare -A config=( [h]="?" [c]="?" [x]="?" [l]="?" [t]="?" [n]="?" )
No loop principal há uma verificação para ver se todos os valores foram configurados, como:
if [ "${config[h]}" == "Y" ] && [ "${config[c]}" == "Y" ] && [ "${config[l]}" == "Y" ] && [ "${config[x]}" == "Y" ] && [ "${config[t]}" == "Y" ] && [ "${config[n]}" == "Y" ];
Agora, quando termino uma execução, desmarco e redeclaro a matriz.
unset config; declare -A config=( [h]="?" [c]="?" [x]="?" [l]="?" [t]="?" [n]="?" )
No entanto, a matriz não parece ser declarada novamente corretamente. Isso porque quando configuro apenas um dos valores, [C]=Y
por exemplo, a if
instrução passa. Eu tenho certeza que sim porque o corpo da if
instrução muda parte da cor do texto. Eu acredito que é porque o resto dos índices não são realmente set="?", então a if
declaração é reduzida para apenas [ "${config[c]}" == "Y"]
which is be true
. Eu sei disso desde quando eu ecoo $config[@]
dentro do corpo da if
declaração, com certeza eu só vejo um "Y" em vez de cinco. Como faço para que o array redeclare corretamente?
EDIT
Obrigado pela atenção;
Os valores são definidos como Y após alguma entrada do usuário. Esta parte eu estou muito confiante e, portanto, omitida da minha pergunta. Todos seguem este formato:
read ch if [ $ch == "Hosts" ]; then while true; do nano listHosts echo -en "Commit this list of Hostnames? [Y|N to re-edit]: " read yn if [ $yn == "Y" ] || [ $yn == "y" ] || [ $yn == "yes" ]; then break elif [ $yn == "N" ] || [ $yn == "n" ] || [ $yn == "no" ]; then continue fi done config[h]="Y"
Em relação ao comentário de Kusalanda, verifiquei se há letras incorretas, mas é consistentemente 'c' minúsculo. Bem, sim, eu quis dizer
${config[@]}
.Declare -p lança alguma luz:
declare -a config='([0]="Y")'
Como é que -p diz que usei a minúscula? As chamadas estão nesta ordem:
unset config
declare -A config=( [h]="?" [c]="?" [x]="?" [l]="?" [t]="?" [n]="?" )
Então eu defino $ch="Commands" via read
;
elif [ $ch == "Commands" ]; then
while true; do
nano iSet
echo -en "Commit this list of commands? [Y|N to re-edit]: "
read yn
if [ $yn == "Y" ] || [ $yn == "y" ] || [ $yn == "yes" ]; then
break
elif [ $yn == "N" ] || [ $yn == "n" ] || [ $yn == "no" ]; then
continue
fi
done
config[c]="Y"
declare -p config
Tentei recriar em um script menor conforme a sugestão do Bodo:
dec() {
declare -A config=( [h]="?", [c]="?" )
}
test() {
declare -p config
if [ "${config[h]}" == "Y" ] && [ "${config[c]}" == "Y" ]; then
echo "Yup"
fi
}
dec
config[h]="Y"; config[c]="Y"
unset config
dec
config[h]="Y"
test
E assim como no meu outro script, a if
resolução é verdadeira:
declare -a config='([0]="Y")'
Yup