連想配列の間接パラメータ拡張

連想配列の間接パラメータ拡張

次のようなこの回答、この方法を私のスクリプトに適用したいと思います。基本原則は次のとおりです。

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

しかし、私が得るのは空の文字列だけです。

これは可能ですか、それとも別の方法を探すべきですか?


私はこれまで2つのアプローチをとってきましたが、どちらも気に入らません。

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 以降、名前参照変数はシェルで使用できます。

おすすめ記事