배열의 원래 순서와 역순을 동시에 얻는 방법은 무엇입니까?

배열의 원래 순서와 역순을 동시에 얻는 방법은 무엇입니까?

arr그럼, 두 가지 요소로 구성된 배열이 있다고 가정해 보겠습니다 .

read -a arr <<< "$@"

그런 다음 함수나 스크립트에서 이를 사용하고 다음과 같이 두 개의 문자열이나 요소를 입력할 수 있습니다.

read_me() {
read -a arr <<< "$@"
}
read_me "first test"

이제 배열의 모든 요소를 ​​가져오는 방법을 알았습니다.

for i in "${arr[@]}"
do
    echo "$i" # where i do something with the respective element of said array.
done

하지만 이는 이전에 언급한 배열에 요소가 추가되는 일반/원래 순서를 통해서만 수행할 수 있습니다. 물론 배열의 요소를 역순으로 가져오는 방법도 알고 있습니다.

indices=( ${!arr[@]} )
for ((i=${#indices[@]} - 1; i >= 0; i--)) ; do
    echo "${arr[indices[i]]}"
done

두 가지 방법 모두 예상대로 작동합니다. 하지만 문제는 정순과 역순이 필요하다는 것입니다.같은 루프에서. 대부분의 경우 이 작업을 수행할 필요가 없습니다.

echo "${arr[0]}" "${arr[1]}"
echo "${arr[1]}" "${arr[0]}"

루프에서 이 작업을 어떻게 수행할 수 있나요?

답변1

array=( 1 2 3 a b c )

for i in "${!array[@]}"; do
    j=$(( ${#array[@]} - i - 1 ))
    printf '%s\t%s\n' "${array[i]}" "${array[j]}"
done

산출:

1       c
2       b
3       a
a       3
b       2
c       1

즉, 현재 인덱스를 기반으로 새 인덱스를 계산하고 사용하는 동안 어떤 순서로든 배열을 반복하는 것을 막을 수 있는 방법이 없습니다.


질문에 대한 댓글 중에는 다음과 같은 내용이 있습니다.제안다음 산술 루프의 경우:

for (( i = 0, j = ${#array[@]} - 1; i < ${#array[@]}; ++i, --j ))
do
    printf '%s\t%s\n' "${array[i]}" "${array[j]}"
done

이는 루프 헤더의 초기화 및 업데이트 부분에서 쉼표 연산자를 사용하여 유지 관리할 수 있다는 사실을 활용합니다.별도의 루프 변수.


달성하려는 목표와 실제 배열 값에 따라 다음을 사용할 수도 있습니다 tac.

$ paste <( printf '%s\n' "${array[@]}" ) <( printf '%s\n' "${array[@]}" | tac )
1       c
2       b
3       a
a       3
b       2
c       1

관련 정보