배열을 뒤집는 쉬운 방법이 있습니까?
#!/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