연관 배열의 간접 매개변수 확장

연관 배열의 간접 매개변수 확장

다음과 같은이 답변, 이 방법을 내 스크립트에 적용하고 싶습니다. 기본 원칙은 다음과 같습니다.

foo="bar" 
baz="foo"
echo "${!baz}"
bar

다음과 같이 번역된 문자열을 제공하고 싶습니다.

declare -A es
declare -A en

#
es["greet"]="Hola"
en["greet"]="Hello"
#
es["world"]="Mundo"
en["world"]="World"

그런 다음 스크립트 상단에서 다음을 설정했습니다.

lang="es"

그 다음에

echo "${!lang["greet"]} ${!lang["world"]}"

나는 출력을 기대합니다 :

Hola Mundo

또는

lang="en"

echo "${!lang["greet"]}" "${!lang["world"]}"

Hello World

하지만 내가 얻는 것은 빈 문자열뿐입니다.

이것이 가능합니까, 아니면 다른 방법을 모색해야 합니까?


나는 지금까지 두 가지 접근 방식을 취했지만 둘 중 어느 것도 마음에 들지 않습니다.

declare -A hello
hello["es"]="Hola"
hello["en"]="Hello"

declare -A world
world["es"]="Mundo"
world["en"]="World"

lang="es"

echo "${hello[$lang]} ${world[$lang]}"
Hola Mundo

또 다른:

lang="es"

if [[ "$lang" = "es" ]]; then
  declare -A language=(
    ["greet"]="Hola"
    ["world"]="Mundo"
  )
elif [[ "$lang" = "en" ]]; then
  declare -A language=(
    ["greet"]="Hello"
    ["world"]="World"
  )
fi

echo "${language["greet"]} ${language["world"]}"
Hola Mundo

답변1

변수를 참조하려면 간접 변수보다는 이름을 사용하십시오.

en연관 배열을 통한 초기 설정 및 es:

$ declare -n lang=en
$ echo "${lang["greet"]} ${lang["world"]}"
Hello World
$ declare -n lang=es
$ echo "${lang["greet"]} ${lang["world"]}"
Hola Mundo

이름으로 참조되는 값은 lang다른 변수의 이름입니다. 이 변수에 액세스하는 것은 lang명명된 변수에 액세스하는 것과 같습니다.

bash버전 4.3부터 이름 참조 변수를 셸에서 사용할 수 있습니다.

관련 정보