102

我有两个数组。

array=(
  Vietnam
  Germany
  Argentina
)
array2=(
  Asia
  Europe
  America
)

我想同时循环这两个数组,即对两个数组的第一个元素调用一个命令,然后对第二个元素调用相同的命令,依此类推。伪代码:

for c in ${array[*]}
do
  echo -e " $c is in ......"
done

我怎样才能做到这一点?

4

5 回答 5

131

从 anishsane 的回答和其中的评论,我们现在知道您想要什么。这是使用 for 循环的bashier风格的相同内容。请参阅参考手册中的循环构造部分。我也在使用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

根据您想要做什么,您不妨考虑第二种可能性。但请注意,您不会轻易控制字段在第二种可能性中的显示顺序(嗯,它是一个关联数组,所以这并不奇怪)。

于 2013-07-01T17:10:44.360 回答
50

如果所有数组都正确排序,只需传递索引。

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
于 2016-01-21T16:13:25.273 回答
23

您需要对数组和数组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的实现。它不适用于包含空格的数组元素。不删除它以保持评论的相关性。请参阅格伦杰克曼的评论而不是下面的答案。

/编辑

或者,您可以使用此选项(无循环):

paste <(tr ' ' '\n' <<< ${array[*]}) <(tr ' ' '\n' <<< ${array2[*]}) | sed 's/\t/ is in /'
于 2013-07-01T11:39:23.880 回答
4

如果这两个 var 是多行的两个字符串,如下所示:

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"
于 2019-05-21T20:37:35.307 回答
4

专门针对所提出的问题(包含 3 个项目的数组):

for i in $(seq 0 2) ; do
  echo "${array1[$i]} is in ${array2[$i]}"
done
于 2019-08-05T08:03:52.133 回答