Arrays 在bash中同时迭代两个数组
我有两个数组Arrays 在bash中同时迭代两个数组,arrays,bash,loops,Arrays,Bash,Loops,我有两个数组 array=( Vietnam Germany Argentina ) array2=( Asia Europe America ) 我想模拟地在这两个数组上循环,即在两个数组的第一个元素上调用命令,然后在第二个元素上调用相同的命令,依此类推。伪代码: for c in ${array[*]} do echo -e " $c is in ......" done 我怎样才能做到这一点?您需要一个循环阵列&array2 i=0 wh
array=(
Vietnam
Germany
Argentina
)
array2=(
Asia
Europe
America
)
我想模拟地在这两个数组上循环,即在两个数组的第一个元素上调用命令,然后在第二个元素上调用相同的命令,依此类推。伪代码:
for c in ${array[*]}
do
echo -e " $c is in ......"
done
我怎样才能做到这一点?您需要一个循环阵列&array2
i=0
while [ $i -lt ${#array[*]} ]; do
echo ${array[$i]} is in ${array2[$i]}
i=$(( $i + 1));
done
Vietnam is in Asia
Germany is in Europe
Argentina is in America
编辑:不要使用以下基于tr
的实现。它不适用于包含空格的数组元素。不删除它以保持评论的相关性。请参阅格伦·杰克曼的评论,而不是下面的答案
/EDIT
或者,您可以使用此选项(不带循环):
粘贴您需要在数组和数组上进行循环2
i=0
while [ $i -lt ${#array[*]} ]; do
echo ${array[$i]} is in ${array2[$i]}
i=$(( $i + 1));
done
Vietnam is in Asia
Germany is in Europe
Argentina is in America
编辑:不要使用以下基于tr
的实现。它不适用于包含空格的数组元素。不删除它以保持评论的相关性。请参阅格伦·杰克曼的评论,而不是下面的答案
/EDIT
或者,您可以使用此选项(不带循环):
paste从安尼希桑的答案和评论中,我们现在知道你想要什么了。在bashier样式中,使用for循环实现了同样的功能。看。我还使用了printf
而不是echo
#!/bin/bash
array=( "Vietnam" "Germany" "Argentina" )
array2=( "Asia" "Europe" "America" )
for i in "${!array[@]}"; do
printf "%s is in %s\n" "${array[i]}" "${array2[i]}"
done
另一种可能是使用关联数组:
#!/bin/bash
declare -A continent
continent[Vietnam]=Asia
continent[Germany]=Europe
continent[Argentina]=America
for c in "${!continent[@]}"; do
printf "%s is in %s\n" "$c" "${continent[$c]}"
done
根据你想做的事情,你不妨考虑一下第二种可能性。但请注意,您无法轻松控制第二种可能性中字段的显示顺序(好吧,这是一个关联数组,因此这并不令人惊讶)。从安尼斯桑的答案和其中的注释中,我们现在知道您想要什么了。在bashier样式中,使用for循环实现了同样的功能。看。我还使用了printf
而不是echo
#!/bin/bash
array=( "Vietnam" "Germany" "Argentina" )
array2=( "Asia" "Europe" "America" )
for i in "${!array[@]}"; do
printf "%s is in %s\n" "${array[i]}" "${array2[i]}"
done
另一种可能是使用关联数组:
#!/bin/bash
declare -A continent
continent[Vietnam]=Asia
continent[Germany]=Europe
continent[Argentina]=America
for c in "${!continent[@]}"; do
printf "%s is in %s\n" "$c" "${continent[$c]}"
done
根据你想做的事情,你不妨考虑一下第二种可能性。但是请注意,您不容易控制第二种可能性中字段的显示顺序(嗯,这是一个关联数组,所以这并不奇怪)。如果所有数组的顺序都正确,只需传递索引即可
array=(
Vietnam
Germany
Argentina
)
array2=(
Asia
Europe
America
)
for index in ${!array[*]}; do
echo "${array[$index]} is in ${array2[$index]}"
done
Vietnam is in Asia
Germany is in Europe
Argentina is in America
如果所有数组的顺序都正确,只需传递索引即可
array=(
Vietnam
Germany
Argentina
)
array2=(
Asia
Europe
America
)
for index in ${!array[*]}; do
echo "${array[$index]} is in ${array2[$index]}"
done
Vietnam is in Asia
Germany is in Europe
Argentina is in America
如果两个变量是具有多行的两个字符串,如下所示:
listA=$(echo -e "Vietnam\nGermany\nArgentina")
listB=$(echo -e "Asia\nEurope\nAmerica")
那么,这种情况的解决方案是:
while read strA <&3 && read strB <&4; do
echo "$strA is in $strB"
done 3<<<"$listA" 4<<<"$listB"
读取strA时如果两个变量是具有多行的两个字符串,如下所示:
listA=$(echo -e "Vietnam\nGermany\nArgentina")
listB=$(echo -e "Asia\nEurope\nAmerica")
那么,这种情况的解决方案是:
while read strA <&3 && read strB <&4; do
echo "$strA is in $strB"
done 3<<<"$listA" 4<<<"$listB"
阅读strA时,特别针对所问问题(包含3项的数组):
特别是针对提出的问题(包含3项的数组):
我想这就是您想要的。@user2354862如果需要,您应该这样做。或者,避免生成两次tr:paste我想这就是您想要的。@user2354862如果需要,您应该这样做。或者,避免两次生成tr:paste它们已经在两个数组中,不需要将它们转换为字符串。它们已经在两个数组中,不需要将它们转换为字符串。副本对值对不是两个并行数组时有一些想法,例如,当值对不是两个并行数组,而是不同目录中的文件名对时,副本有一些想法。