bash shell script loop에서 array index 변수에 액세스하고 있습니까?


19

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

이것을 달성하기 위해 스크립트를 어떻게 변경합니까?


7
또한 기본적으로 "${array[*]}"대신에 절대 원하지 않습니다 "${array[@]}". 다소 사용 *하지 않고 사용 @하면 배열 대신 문자열로 처리됩니다.
jordanm

답변:


27

배열 키 목록을 사용하여이 작업을 수행 할 수 있습니다 . 로부터 bash매뉴얼 페이지

${!name[@]}
${!name[*]}

배열 키 목록 . name이 배열 변수 인 경우 name에 지정된 배열 색인 (키) 목록으로 확장됩니다. name이 배열이 아닌 0경우 name이 설정되면 확장되고 그렇지 않으면 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

1
이 답변은 원하는 결과를 달성하지만, printf 문에 의해 불필요하게 난독 화됩니다. 예를 들어 : printf "$i=(${AR[i]})\n"또는 echo "$i=(${ARi]})"둘 다 key & var를 얻는 방법을 보여줌으로써 약간의 추가를 주지만 엄격히 말하면 echo "$i"OP에 대답했을 것입니다. 나머지는 "bash fu"입니다 :)
dimmech

5

jordanm의 답변 외에도 다음 C과 같은 루프를 수행 할 수 있습니다 bash.

for ((idx=0; idx<${#array[@]}; ++idx)); do
    echo "$idx" "${array[idx]}"
done

1

당신은 이런 식으로 할 수 있습니다 :

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
length=${#AR[@]}
for (( i = 0; i < length; i++ )); do
  echo "$i"
done

산출:

0
1
2
3

1
이것은  pfnuesel의 답변   이 아직 말하지 않았다고 무엇을 말합니까?
G-Man, 'Reinstate

실수 할 수도 있지만 pfnuesels는 각 반복에서 배열 길이를 다시 평가하지 않습니까?
Chris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.