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它们已经在两个数组中,不需要将它们转换为字符串。它们已经在两个数组中,不需要将它们转换为字符串。副本对值对不是两个并行数组时有一些想法,例如,当值对不是两个并行数组,而是不同目录中的文件名对时,副本有一些想法。