Bash 本身不支持二维数组,但我想模拟一个。作为一个最小的工作示例,假设我有两个数组,a0并且a1:
a0=(1 2 3 4)
a1=(5 6 7 8)
Run Code Online (Sandbox Code Playgroud)
我想编写一个for循环来打印a0and的第三个元素a1。当然,我可以通过两次显式调用来手动执行此操作echo:
echo ${a0[2]}
echo ${a1[2]}
Run Code Online (Sandbox Code Playgroud)
但是,我想用一个for循环来概括这一点。我怎样才能做到这一点?
我尝试了以下方法:
for i in ${a0[@]} ${a1[@]}
do
echo {$i}[2]
echo ${i[2]}
echo ${i}[2]
echo ${$i[2]}
echo ${${i}[2]}
done
Run Code Online (Sandbox Code Playgroud)
但是这些尝试都没有成功。我得到这个输出:
{1}[2]
1[2]
chgreen.sh: line 30: ${$i[2]}: bad substitution
Run Code Online (Sandbox Code Playgroud)
你有什么想法?
你在迭代错误的东西。您for将数组的每个元素保存为$i,而不是数组的索引。你想要的是类似的东西
#!/usr/bin/env bash
a0=(1 2 3 4)
a1=(5 6 7 8)
for ((i=0;i<${#a0[@]};i++))
do
echo ${a0[$i]} ${a1[$i]};
done
Run Code Online (Sandbox Code Playgroud)
正如您\xe2\x80\x99 现在可能已经从研究中了解到的那样,\nbash本身不支持多维数组,\n但它确实支持\xe2\x80\x9cassociative\xe2\x80\x9d数组。\xc2\xa0\n这些基本上是由字符串而不是数字索引的,因此您可以拥有,例如,
\n\ngrade[John]=100\ngrade[Paul]=100\ngrade[George]=90\ngrade[Ringo]=80\nRun Code Online (Sandbox Code Playgroud)\n\n正如您链接到的问题的接受答案\n所示,关联数组的索引可以包含逗号,\n因此一个常见的技巧是连接各个索引(0-1 \xc3\x97 0 -3) 成一个字符串,\n用逗号分隔。\xc2\xa0\n虽然这比普通数组更麻烦,但它可以是有效的:
\n\n$ declare -A a <-- 创建关联数组。\n$ a[0,0]=1\n$ a[0,1]=2\n$ a[0,2]=3\n$ a[0,3]=4\n$ a[1 ,0]=5\n$ a[1,1]=6\n$ a[1,2]=7\n$ a[1,3]=8\n$ 对于 i 在 0 1\n> 中\n> echo ${a[$i,2]}\n> did\n3 <-- 这里\xe2\x80\x99是你的输出。\n7\n