연관 배열이있는 쉘
일부 최신 쉘은 연관 배열을 제공합니다 : ksh93, bash ≥4, zsh. ksh93 및 bash에서 a
연관 배열 인 경우 "${!a[@]}"
해당 키의 배열입니다.
for k in "${!a[@]}"; do
echo "$k -> ${a[$k]}"
done
zsh에서 해당 구문은 ksh 에뮬레이션 모드에서만 작동합니다. 그렇지 않으면 zsh의 기본 구문을 사용해야합니다.
for k in "${(@k)a}"; do
echo "$k -> $a[$k]"
done
${(k)a}
a
빈 키가없는 경우에도 작동합니다 .
zsh에서는 ey k
와 v
alues를 동시에 반복 할 수도 있습니다 .
for k v ("${(@kv)a}") echo "$k -> $v"
연관 배열이없는 쉘
연관 배열이없는 쉘에서 연관 배열을 에뮬레이트하는 것이 훨씬 더 많은 작업입니다. 연관 배열이 필요한 경우 ksh93 또는 Perl과 같은 더 큰 도구를 가져와야 할 때입니다.
단순한 POSIX 쉘에 연관 배열이 필요한 경우 키가 문자 0-9A-Z_a-z
(ASCII 숫자, 문자 및 밑줄) 만 포함하도록 제한 될 때이를 배열하는 방법이 있습니다 . 이 가정 하에서 키는 변수 이름의 일부로 사용될 수 있습니다. 아래 함수는 두 개의 연속 밑줄을 포함해서는 안되는 이름 지정 접두사 "줄기"로 식별되는 배열에서 작동합니다.
## ainit STEM
## Declare an empty associative array named STEM.
ainit () {
eval "__aa__${1}=' '"
}
## akeys STEM
## List the keys in the associatve array named STEM.
akeys () {
eval "echo \"\$__aa__${1}\""
}
## aget STEM KEY VAR
## Set VAR to the value of KEY in the associative array named STEM.
## If KEY is not present, unset VAR.
aget () {
eval "unset $3
case \$__aa__${1} in
*\" $2 \"*) $3=\$__aa__${1}__$2;;
esac"
}
## aset STEM KEY VALUE
## Set KEY to VALUE in the associative array named STEM.
aset () {
eval "__aa__${1}__${2}=\$3
case \$__aa__${1} in
*\" $2 \"*) :;;
*) __aa__${1}=\"\${__aa__${1}}$2 \";;
esac"
}
## aunset STEM KEY
## Remove KEY from the associative array named STEM.
aunset () {
eval "unset __aa__${1}__${2}
case \$__aa__${1} in
*\" $2 \"*) __aa__${1}=\"\${__aa__${1}%%* $2 } \${__aa__${1}#* $2 }\";;
esac"
}
(경고, 테스트되지 않은 코드. 구문 상 유효하지 않은 스템 및 키에 대한 오류 감지는 제공되지 않습니다.)