연관 배열을 선언합니다.
declare -A array=([a]=blue [b]=red [c]=yellow)
이제 할 수 있습니다:
echo ${array[@]} --> blue red yellow
또는
echo ${array[b]} --> red
또는
echo ${!array[@]} --> a b c
red
이제 값과 관련된 키를 알고 싶습니다 . 단일 키만 감지하는 방법이 있습니까?
답변1
특정 값에 해당하는 키 목록을 얻고 이 목록을 배열에 저장한다고 가정해 보겠습니다.
#!/bin/bash
declare -A hash
hash=(
[k1]="hello world"
[k2]="hello there"
[k3]="hello world"
[k4]=bumblebees
)
string="hello world"
keys=()
for key in "${!hash[@]}"; do
if [[ ${hash[$key]} == "$string" ]]; then
keys+=( "$key" )
fi
done
printf 'Keys with value "%s":\n' "$string"
printf '\t%s\n' "${keys[@]}"
그러면 키 목록을 반복하여 찾고 있는 문자열에 대해 각 키의 값을 테스트합니다. 일치하는 항목이 있으면 키를 keys
배열에 저장합니다.
마지막으로 검색된 키가 출력됩니다.
이 스크립트의 출력은 다음과 같습니다.
Keys with value "hello world":
k1
k3
답변2
쉘 ( 연관 배열 지원은 수십 년 전에 존재했음을 zsh
참고 )에는 다음 연산자가 있습니다.zsh
bash
${hash[(R)pattern]}
다음으로 확장가치패턴과 일치합니다.${(k)hash[(R)pattern]}
해당 값이 패턴과 일치하는 키로 확장됩니다.${(k)hash[(Re)string]}
제외하고 동일끈e
와일드카드 문자가 포함된 경우에도 패턴이 아닌 xact 문자열 로 처리됩니다 .
그래서:
print -r -- ${(k)array[(Re)red]}
인쇄할 것이다비어 있지 않음값이 인 키입니다 red
.
빈 키를 포함하려면 다음을 사용하세요.
$ typeset -A array
$ array=(a blue b red c yellow '' red)
$ printf '<%s>\n' "${(@k)array[(Re)red]}"
<>
<b>
답변3
예쁘지는 않지만 다음과 같이 할 수 있습니다.
for k in "${!array[@]}"; do
[[ ${array[$k]} == red ]] && printf '%s\n' "$k"
done
이는 배열의 인덱스를 반복하여 각 인덱스의 값이 인지 확인하고 red
, 그렇다면 인덱스를 인쇄합니다.
또는 덜 예쁘면 다음을 사용할 수 있습니다 sed
.
declare -p array | sed -n 's/.*\[\(.*\)\]="red".*/\1/p'
그러면 선언된 배열이 인쇄되고 값의 인덱스를 찾아서 red
인쇄됩니다.