Programing

Bash에서 동시에 두 배열을 반복합니다.

lottogame 2020. 11. 8. 09:10
반응형

Bash에서 동시에 두 배열을 반복합니다.


두 개의 배열이 있습니다.

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

이 두 배열을 동시에 반복합니다. 즉, 두 배열의 첫 번째 요소에 대해 명령을 호출 한 다음 두 번째 요소에 대해 동일한 명령을 호출하는 식입니다. 의사 코드 :

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

어떻게 할 수 있습니까?


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

또 다른 가능성은 연관 배열을 사용하는 것입니다.

#!/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

배열 및 배열 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기반 구현을 사용하지 마십시오 . 공백을 포함하는 배열 요소에는 작동하지 않습니다. 댓글의 관련성을 유지하기 위해 제거하지 않습니다. 아래 답변 대신 glenn jackman의 의견을 참조하십시오.

/편집하다

또는 루프없이이 옵션을 사용할 수 있습니다.

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

두 변수가 다음과 같이 여러 줄이있는 두 문자열 인 경우 :

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"

특히 질문에 대한 질문 (3 개 항목이있는 배열) :

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

참고URL : https://stackoverflow.com/questions/17403498/iterate-over-two-arrays-simultaneously-in-bash

반응형