次のようなこの回答、この方法を私のスクリプトに適用したいと思います。基本原則は次のとおりです。
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 以降、名前参照変数はシェルで使用できます。