bash 쉘 스크립트 루프에서 배열 인덱스 변수에 액세스합니까?

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 

이 작업을 수행하기 위해 스크립트를 어떻게 변경합니까?

댓글

  • 또한 기본적으로 "${array[@]}" 대신 "${array[*]}"가 필요합니다. @ 대신 *를 사용하면 배열이 아닌 문자열로 처리됩니다.

답변

배열 키 목록 을 사용하여이 작업을 수행 할 수 있습니다. 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는 각 반복에서 배열 길이를 재평가하지 않는다고 대답합니까?

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다