Bash - 역방향 배열

Bash - 역방향 배열

배열을 뒤집는 쉬운 방법이 있습니까?

#!/bin/bash

array=(1 2 3 4 5 6 7)

echo "${array[@]}"

그래서 나는 다음 7 6 5 4 3 2 1
대신에 다음을 얻게 될 것입니다:1 2 3 4 5 6 7

답변1

또 다른 색다른 접근 방식:

#!/bin/bash

array=(1 2 3 4 5 6 7)

f() { array=("${BASH_ARGV[@]}"); }

shopt -s extdebug
f "${array[@]}"
shopt -u extdebug

echo "${array[@]}"

산출:

7 6 5 4 3 2 1

활성화 되면 extdebug배열 BASH_ARGV에는 함수의 모든 위치 매개변수가 역순으로 포함됩니다.

답변2

색다른 방법(순수하지도 않음 bash):

  • 배열의 모든 요소가 질문에서와 같이 단 하나의 문자인 경우 다음을 사용할 수 있습니다 rev.

     echo "${array[@]}" | rev
    
  • 그렇지 않고 배열 요소에 개행 문자가 포함되어 있지 않은 경우:

     printf '%s\n' "${array[@]}" | tac | tr '\n' ' '; echo
    
  • 사용할 수 있는 경우 zsh:

     echo ${(Oa)array}
    

답변3

나는 작성된 질문에 대답했으며 이 코드는 배열을 뒤집습니다. (배열을 뒤집지 않고 요소를 역순으로 인쇄하는 것은 for마지막 요소에서 0까지 카운트다운하는 루프일 뿐입니다.) 이것은 표준 "첫 번째와 마지막 교체" 알고리즘입니다.

array=(1 2 3 4 5 6 7)

min=0
max=$(( ${#array[@]} -1 ))

while [[ min -lt max ]]
do
    # Swap current first and last elements
    x="${array[$min]}"
    array[$min]="${array[$max]}"
    array[$max]="$x"
    
    # Move closer
    (( min++, max-- ))
done

echo "${array[@]}"

홀수 및 짝수 길이 배열 모두에서 작동합니다.

답변4

배열 위치를 바꾸려면(희소 배열도 포함)(bash 3.0부터):

#!/bin/bash
# Declare an sparse array to test:
array=([5]=101 [6]=202 [10]=303 [11]=404 [20]=505 [21]=606 [40]=707)
echo "Initial array values"
declare -p array

swaparray(){ local temp; temp="${array[$1]}"
             array[$1]="${array[$2]}"
             array[$2]="$temp"
           }

ind=("${!array[@]}")                         # non-sparse array of indexes.

min=-1; max="${#ind[@]}"                     # limits to one before real limits.
while [[ min++ -lt max-- ]]                  # move closer on each loop.
do
    swaparray "${ind[min]}" "${ind[max]}"    # Exchange first and last
done

echo "Final Array swapped in place"
declare -p array
echo "Final Array values"
echo "${array[@]}"

실행 시:

./script
Initial array values
declare -a array=([5]="101" [6]="202" [10]="303" [11]="404" [20]="505" [21]="606" [40]="707")

Final Array swapped in place
declare -a array=([5]="707" [6]="606" [10]="505" [11]="404" [20]="303" [21]="202" [40]="101")

Final Array values
707 606 505 404 303 202 101

이전 bash의 경우 루프(bash(2.04부터))를 사용해야 하며 $a다음을 사용하여 후행 공백을 피해야 합니다.

#!/bin/bash

array=(101 202 303 404 505 606 707)
last=${#array[@]}

a=""
for (( i=last-1 ; i>=0 ; i-- ));do
    printf '%s%s' "$a" "${array[i]}"
    a=" "
done
echo

2.03 이후의 bash의 경우:

#!/bin/bash
array=(101 202 303 404 505 606 707)
last=${#array[@]}

a="";i=0
while [[ last -ge $((i+=1)) ]]; do 
    printf '%s%s' "$a" "${array[ last-i ]}"
    a=" "
done
echo

추가적으로 (비트 부정 연산자 사용) (bash 4.2+부터):

#!/bin/bash
array=(101 202 303 404 505 606 707)
last=${#array[@]}

a=""
for (( i=0 ; i<last ; i++ )); do 
    printf '%s%s' "$a" "${array[~i]}"
    a=" "
done
echo

관련 정보