쉘 스크립트에서 연관 배열을 구현하는 트릭을 보았습니다. 예를 들어 여기서 key = apples print array["apples"]
로 스크립팅 할 수 있습니다 echo \$array$key
.
그러나 배열을 반복하기 위해 키를 생성하는 방법에 대한 언급이 없습니다. 내가 생각할 수있는 유일한 방법은 for-loop를 사용하여 배열을 반복 할 수 있도록 공백으로 구분 된 변수에 키를 저장하는 것입니다.
그렇다면 나중에 사용하기 위해 키를 저장하는 다른 방법이 있습니까?
일부 최신 셸은 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"
}
(경고, 테스트되지 않은 코드. 구문 상 유효하지 않은 스템 및 키에 대한 오류 감지는 제공되지 않습니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다