source

bash에서 2개 이상의 어레이를 동시에 반복합니다.

gigabyte 2023. 4. 19. 23:09
반응형

bash에서 2개 이상의 어레이를 동시에 반복합니다.

2개의 어레이가 있습니다.

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

이 두 어레이를 동시에 루프합니다.즉, 두 어레이의 첫 번째 요소에서 명령을 호출하고 두 번째 요소에서 동일한 명령을 호출하는 등의 작업을 수행합니다.유사 코드:

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

이거 어떻게 해?

아니샨의 대답과 그 코멘트를 통해 우리는 당신이 무엇을 원하는지 알 수 있습니다.여기 같은 것을 bashier 스타일로 나타냅니다.for loop을 사용합니다.참조 매뉴얼의 "루핑 구성" 섹션을 참조하십시오.저도 쓰고 있어요.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

어레이 및 어레이에 대한 루프오버가 필요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 /'

특히 질문의 경우 (3개의 아이템으로 배열)

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

두 개의 변수가 여러 줄을 가진 두 개의 문자열인 경우 다음과 같이 하십시오.

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"

나는 두 가지 이유로 이 답을 여기에 추가한다.먼저, imo false taged duplicate(bash의 값 쌍 위에 루프)가 여기에 표시됩니다.
둘째, 시나리오는 약간 다르지만 이 답변은 주제에 대한 귀중한 지식을 추가합니다.

이 질문에서는 2개의 어레이가 반복됩니다.복제된 어레이에서는 연결된 값에 대해 중첩된 반복이 존재하므로 값 쌍에 대해 반복됩니다.

다음은 값 쌍의 배열에서 값 쌍에 대한 반복입니다. 도움이 되었습니다.

PAIRS=("Vietnam Asia" \
"Germany Europe" \
"Argentina America")

for pair in "${PAIRS[@]}"
do
set -- $pair
echo "$1 is in $2"
done

주의:set -- e예를 들면...이 경우 첫 번째 반복에 대한 첫 번째 및 두 번째 매개 변수로서 베트남과 아시아가 사용됩니다.

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

반응형