我有一个像菜单一样的程序。它有一个关联数组config
,称为:
declare -A config=( [h]="?" [c]="?" [x]="?" [l]="?" [t]="?" [n]="?" )
在主循环中检查是否所有值都已配置,例如:
if [ "${config[h]}" == "Y" ] && [ "${config[c]}" == "Y" ] && [ "${config[l]}" == "Y" ] && [ "${config[x]}" == "Y" ] && [ "${config[t]}" == "Y" ] && [ "${config[n]}" == "Y" ];
现在,当我完成一次运行时,我取消设置并重新声明数组。
unset config; declare -A config=( [h]="?" [c]="?" [x]="?" [l]="?" [t]="?" [n]="?" )
但是,该数组似乎没有被正确地重新声明。这是因为当我只配置其中一个值时,[C]=Y
例如,if
语句通过。我肯定会这样做,因为if
语句的主体会改变一些文本颜色。我相信这是因为其余的索引实际上并未设置为“?”,因此该if
语句被简化为[ "${config[c]}" == "Y"]
is true
。我知道这一点,因为当我$config[@]
在if
声明正文中回显时,果然我只看到一个“Y”而不是五个。如何让数组正确重新声明?
编辑
感谢您的关注;
在一些用户输入后,值被设置为 Y。这部分我非常有信心,因此从我的问题中省略了。它们都遵循这种格式:
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"
关于 Kusalanda 的评论,我检查了不正确的大小写,但它始终是小写的“c”。同样,是的,我的意思是
${config[@]}
。Declare -p 提供了一些启示:
declare -a config='([0]="Y")'
-p 怎么会说我用的是小写的 a?调用顺序如下:
unset config
declare -A config=( [h]="?" [c]="?" [x]="?" [l]="?" [t]="?" [n]="?" )
read
然后我通过;设置 $ch="Commands"
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
根据 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
就像在我的其他脚本中一样,if
解析为 true:
declare -a config='([0]="Y")'
Yup
您必须在函数中使用 . 将数组声明为全局数组
declare -g ...
。否则数组将是函数中的局部变量。见https://unix.stackexchange.com/a/136721/330217使用一些调试输出查看这个修改后的脚本
输出是
当我取消注释您的行并注释我修改后的行时,输出为
复制自@ilkkachu 的评论:
这可以在
declare -a config=([0]="Y")
原始脚本的输出中看到。