안녕 내 안에이전 질문zsh 쉘에서 연관 배열을 사용하는 방법을 명확하게 이해합니다.
하지만 스크립트에서 다음 명령을 실행할 때마다
for KEY in ${!array[@]}
내 배열의 키 간 반복
오류 가 발생합니다 bad substitution
.
심지어 echo ${!array[@]}
동일하게 주어졌습니다.
참고: array
내 연관 배열의 이름입니다.
답변1
zsh
Bash와는 다른 매개변수 대체가 있습니다.man zshexpn
. 여러 가지를 지원합니다확장된 동작을 위한 수정자, 변수 이름 앞에 괄호 안에 표시: ${(X)name}
. 배열 키(연관 배열 포함)를 포함하는 수정자는 배열의 키 목록으로 확장되지만 빈 문자열인 경우 키를 생략합니다 k
. 빈 키를 유지하려면 ${(k)array}
큰따옴표와 @
수정자를 사용하세요.
for x in "${(@k)array}" ; ...
배열의 키를 반복합니다 array
.
답변2
을 사용해야 하며 "${(@k)array}"
null "${(k)array}"
이 아닌 키로만 확장됩니다.
typeset -A array
array=(k1 v1 k2 v2 k3 v3)
for k in "${(@k)array}"; do
printf "%s -> %s\n" "$k" "$array[$k]"
done
그 다음에:
$ zsh test.zsh
k1 -> v1
k2 -> v2
k3 -> v3
for
루프를 키, 값 확장으로 바꿀 수도 있습니다 .
printf '%s -> %s\n' "${(@kv)array}"
답변3
내가 아는 한 ${!...}
그것은 존재하지 않습니다. 내 생각엔 당신이 원하는 것 같아요: ${(k)array[@]}
, 또는 간단히 ${(k)array}
. 자세한 내용은 zshexpn(1)
확장 플래그에 대해 k
"이름이 연관 배열을 참조하는 경우 요소 값 대신 키(요소 이름)가 대체됩니다."라는 설명이 있는 매뉴얼 페이지를 참조하세요.