루프의 다른 모든 배열 요소 열거

루프의 다른 모든 배열 요소 열거

키 쌍 값이 포함된 동적 배열이 있는데 다음을 열거하고 싶습니다.그 밖의 모든값. 이 경우에는 배열의 이름만 사용됩니다. 저는 bash v4를 사용하지 않기 때문에 seqecho를 사용하여 배열을 단계별로 실행할 수 있었습니다 .

$ array=(Guido yes Francesca no Balthazar yes)
for x in $(seq 0 2 ${#array[@]});do echo $x;done
0
2
4
6

이것은 내가 가지고 있는 쌍보다 하나 더 많은 요소를 반환하지만(0 오프셋으로 인해) 간단한 bash 수학을 사용하여 이를 설명할 수 있습니다.

for x in $(seq 0 2 $((${#array[@]}-1)));do echo $x;done
0
2
4

이것은 잘 작동합니다. 하지만 에서 요소를 가져오자마자 $array설명할 수 없는 오류가 발생합니다. 나는 "수학"을 사용하거나 사용하지 않고 시도했습니다.

$ for x in $(seq 0 2 $((${#array[@]}-1)));do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")

$ for x in $(seq 0 2 ${#array[@]});do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")

이 동적 배열에서 이름만 가져오려면 어떻게 해야 합니까?

편집하다:$BASH_VERSION것은 3.2.57(1)-release(맥 OS X 10.10.2)

편집 #2:나는 이것이 아마도 이 버전의 버그일 것이라는 결론에 도달했습니다. 저는 다수의 AWS 인스턴스를 관리하고 있기 때문에 해당 인스턴스를 확인하기로 결정했으며 모두 bash 4.1.2(1)를 가지고 있습니다. Mac을 이 버전으로 업그레이드했는데 이제 작동합니다. 찾아주셔서 감사합니다. 하지만 이상 현상이 발생한 것 같습니다.

답변1

배열의 대체 요소를 반복하려면 다음이 bash 3.2에서 작동해야 합니다.

while IFS= read -d '' -r name; do
  # do something with "$name"
done < <(printf %s%.0s\\0 "${array[@]}")

xargs -0더 편리하다면 비슷한 일을 할 수 있습니다 .

예를 들어 이름에 콜론이 포함되어 있지 않으면 다음과 같이 이름을 새 배열로 추출할 수 있습니다.

IFS=: read -a names -r < <(printf %s%.0s: "${array[@]}")

(안타깝게도 필드 구분 기호를 NUL로 설정할 수 없습니다.)

printf이들 모두는 모든 인수를 사용하는 데 필요한 만큼 자주 형식 문자열을 반복한다는 사실에 의존합니다 (Posix 동작이므로 모든 bash 버전 또는 비 내장 버전에서 작동해야 함 printf). 가끔 유용한 형식은 %.0s인수를 사용하고 인수에서 최대 0자를 인쇄합니다. 즉, 비트버킷에 해당 형식을 넣습니다.

관련 정보