。我想定义多个数组,以便每个数组的第一个元素[0]是数组的名称,其他两个元素只是稍后在脚本中使用的参数,例如:
a0=(a0 a1 a2)
b0=(b0 b1 b2)
c0=(c0 c1 c2)
然后使用zenity窗口,要求用户选择一个或多个显示的选项(在本例中已经定义了三个数组名称),并将用户的选择保存在新数组arrChoice()中,如:
arrChoice=($(zenity --list --checklist --column="Select" --column="Selection:" FALSE "${a0[0]}" FALSE "${b0[0]}" FALSE "${c0[0]}" --multiple --separator=" "))
然后我想使用for循环引用用户在zenity提示符中选择的每个数组的元素,如:
for f in "${arrChoice[@]}"; do
newName="${f[0]}_${f[1]}" ; echo "\$newName: ${newName}"
id="${f[2]}" ; echo "\$id: ${id}"
done
回声的预期输出:
$a0: a0_a1
$id: a2
$b0: b0_b1
$id: b2
$c0: c0_c1
$id: c2
但输出仅为:
$a0: a0_
$id:
$b0: b0_
$id:
$c0: c0_
$id:
因此zenity窗口会根据需要弹出,用户选择所有三个选项,但是每个数组的var赋值的第一行得到第一个附加下划线设置ok的元素,但是后面没有追加每个数组的第二个元素,并且正如预期的那样,$ id var分配给每个数组的第三个元素。
答案 0 :(得分:1)
你需要这样的间接扩张:
for f in "${arrChoice[@]}"; do
base=$f[0]
middle=$f[1]
newName="${!base}_${!middle}"
echo "\$newName: ${newName}"
id=$f[2]
id=${!id}
echo "\$id: ${id}"
done
请参阅Shell Parameter Expansion section in the Bash Reference Manual。
答案 1 :(得分:0)
所说的arrChoice
并没有像你想象的那样被填充:
arrChoice=($(zenity --list --checklist --column="Select" \
--column="Selection:" FALSE "${a0[0]}" FALSE "${b0[0]}" FALSE "${c0[0]}" \
--multiple --separator=" "))
输出${arrChoice[@]}
并确保它按照您认为在上述之后的方式填充。已经有一段时间了,但我认为你的zenity错误是Each entry must be separated by a newline character.
这看起来很奇怪,但试一试:
arrChoice=($(zenity --list --checklist --separator=" " \
--column="Select" --column="Selection:" --print-column="Selection:" \
FALSE "${a0[0]}" \
FALSE "${b0[0]}" \
FALSE "${c0[0]}" \
))
请参阅List Dialog什么是--multiple
?