bash 쉘 스크립트의 배열을 반복하면서 배열 인덱스 변수에 액세스하고 싶습니다.
myscript.sh
#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in ${AR[*]}; do echo $i done
위 스크립트의 결과는 다음과 같습니다.
foo bar baz bat
내가 찾는 결과는 다음과 같습니다.
0 1 2 3
이 작업을 수행하기 위해 스크립트를 어떻게 변경합니까?
댓글
답변
배열 키 목록 을 사용하여이 작업을 수행 할 수 있습니다. bash
매뉴얼 페이지 :
${!name[@]}
${!name[*]}
배열 키 목록 . name이 배열 변수 인 경우 name에 할당 된 배열 인덱스 (키) 목록으로 확장됩니다. name이 배열이 아닌 경우 name이 설정되면
0
로 확장되고 그렇지 않으면 null로 확장됩니다.@
가 사용되고 확장이 큰 따옴표 안에 표시되면 각 키는 별도의 단어로 확장됩니다.
예 :
#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done
결과 :
${AR[0]}=foo ${AR[1]}=bar ${AR[2]}=baz ${AR[3]}=bat
또한 비 성공 색인 작업 :
#!/bin/bash AR=([3]="foo" [5]="bar" [25]="baz" [7]="bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done
결과 :
${AR[3]}=foo ${AR[5]}=bar ${AR[7]}=bat ${AR[25]}=baz
댓글
- 이 답변은 원하는 결과를 달성하지만 printf 문에 의해 불필요하게 난독 화됩니다. 예 :
printf "$i=(${AR[i]})\n"
또는echo "$i=(${ARi]})"
둘 다 키를 얻는 방법을 보여줌으로써 약간의 추가 기능을 제공합니다. & var이지만 엄격히 말하면echo "$i"
가 OP에 응답했을 것입니다. 나머지는 " bash fu " 🙂 - 불가능한 이유 :
a=(1 2);echo ${a[0]} # result: 1
?
Answer
jordanm”의 답변에 추가하여 C
like loop in bash
:
for ((idx=0; idx<${#array[@]}; ++idx)); do echo "$idx" "${array[idx]}" done
댓글
- 희소 배열이 아닌 경우에만 …
답변
다음과 같이 할 수 있습니다.
#!/bin/bash AR=("foo" "bar" "baz" "bat") length=${#AR[@]} for (( i = 0; i < length; i++ )); do echo "$i" done
출력 :
0 1 2 3
댓글
- pfnuesel의 대답 은 아직 말하지 않습니까?
- 나는 착각 할 수 있지만 pfnuesels는 각 반복에서 배열 길이를 재평가하지 않는다고 대답합니까?
"${array[@]}"
대신"${array[*]}"
가 필요합니다.@
대신*
를 사용하면 배열이 아닌 문자열로 처리됩니다.