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