연관 배열의 특정 값에 해당하는 키를 가져옵니다.

연관 배열의 특정 값에 해당하는 키를 가져옵니다.

연관 배열을 선언합니다.

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참고 )에는 다음 연산자가 있습니다.zshbash

  • ${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인쇄됩니다.

관련 정보