在bash中同时迭代两个数组

use*_*862 68 arrays bash loops

我有两个数组.

array=(
  Vietnam
  Germany
  Argentina
)
array2=(
  Asia
  Europe
  America
)
Run Code Online (Sandbox Code Playgroud)

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

for c in $(array[*]}
do
  echo -e " $c is in ......"
done
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

gni*_*urf 87

从anishsane的回答和其中的评论我们现在知道你想要什么.这是使用for循环的bashier风格的相同内容.请参阅参考手册中的 " 循环结构"部分.我也用printf而不是echo.

#!/bin/bash

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

for ((i=0;i<${#array[@]};++i)); do
    printf "%s is in %s\n" "${array[i]}" "${array2[i]}"
done
Run Code Online (Sandbox Code Playgroud)

另一种可能是使用关联数组:

#!/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
Run Code Online (Sandbox Code Playgroud)

根据你想做的事情,你不妨考虑第二种可能性.但请注意,你不会轻易控制第二种可能性显示字段的顺序(好吧,它是一个关联数组,所以这并不是一个惊喜).

  • 请不要将变量称为“数组”。曾经。答案+1。 (4认同)
  • @Brian也许你有旧版本的bash.关联数组出现在bash 4中.如果是这种情况,你只能使用我的帖子的第一个例子,而不是第二个例子. (3认同)
  • @Brian`-a`用于索引数组(即常规数组),`-A`用于关联数组(哈希表),所以在这种情况下`-A`是正确的. (2认同)
  • @ToiletGuy 使用您想要的名称。我重复使用了 OP 使用的名称 (2认同)

cth*_*pdx 36

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

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
Run Code Online (Sandbox Code Playgroud)


ani*_*ane 14

你需要一个循环数组和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
Run Code Online (Sandbox Code Playgroud)

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

paste <(tr ' ' '\n' <<< ${array[*]}) <(tr ' ' '\n' <<< ${array2[*]}) | sed 's/\t/ is in /'
Run Code Online (Sandbox Code Playgroud)

  • 我**GUESS**这就是你想要的. (3认同)
  • 或者,避免产生tr两次:`paste <(printf"%s \n"""$ {array [@]}")<(printf"%s \n""$ {array2 [@]}")| sed's /\t /位于/'` (3认同)

run*_*el0 9

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

for i in $(seq 0 2) ; do
  echo "${array1[$i]} is in ${array2[$i]}"
done
Run Code Online (Sandbox Code Playgroud)

  • 甚至`for i in 0 1 2; 做…… (2认同)
  • 或者 `for i in {0..2}; 做` (2认同)

Fab*_*ira 5

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

listA=$(echo -e "Vietnam\nGermany\nArgentina")
listB=$(echo -e "Asia\nEurope\nAmerica")
Run Code Online (Sandbox Code Playgroud)

那么,针对这种情况的解决方案是:

while read strA <&3 && read strB <&4; do
   echo "$strA is in $strB"
done 3<<<"$listA" 4<<<"$listB"
Run Code Online (Sandbox Code Playgroud)