zsh 쉘의 오류 대체 오류

zsh 쉘의 오류 대체 오류

안녕 내 안에이전 질문zsh 쉘에서 연관 배열을 사용하는 방법을 명확하게 이해합니다.

하지만 스크립트에서 다음 명령을 실행할 때마다

for KEY in ${!array[@]}내 배열의 키 간 반복

오류 가 발생합니다 bad substitution.

심지어 echo ${!array[@]}동일하게 주어졌습니다.

참고: array내 연관 배열의 이름입니다.

답변1

zshBash와는 다른 매개변수 대체가 있습니다.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"이름이 연관 배열을 참조하는 경우 요소 값 대신 키(요소 이름)가 대체됩니다."라는 설명이 있는 매뉴얼 페이지를 참조하세요.

관련 정보