关联数组中的间接参数扩展

关联数组中的间接参数扩展

下列的这个答案,我想在我的脚本上应用该方法。它的基本原理是:

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 中可用。

相关内容