下列的这个答案,我想在我的脚本上应用该方法。它的基本原理是:
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 版开始,名称引用变量在 shell 中可用。