访问数组的数组元素,该数组是另一个数组的元素

时间:2014-06-25 22:17:12

标签: bash

。我想定义多个数组,以便每个数组的第一个元素[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分配给每个数组的第三个元素。

2 个答案:

答案 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

相关问题