以变​​量名调用其他变量 (Bash)

以变​​量名调用其他变量 (Bash)

目前我有接下来的路

langs="EN GE"
dir_EN=/xx
dir_GE=/zz

正如您所看到的,变量 $langs 在单个数组中包含所有可能的语言。我想使用一个循环将所有这些路径保存在多语言(dir_ML)数组中,该循环检查语言是什么,然后保存相应的路径。这是我到目前为止所拥有的

for i in $(seq 0 1); do #I used seq because I didn't know how to specify the length of the variable $langs
    dir_ML[$i]=dir_${langs[$i]}
done

我正在寻找的输出是

dir_ML[0]=/xx

dir_ML[1]=/zz

我希望你能理解我想做什么!提前致谢

答案1

langs不是数组,而是代码中的字符串。

使其成为数组并使用它:

langs=( EN GE )
dir_EN=/xx
dir_GE=/zz

dir_ml=()
for i in "${langs[@]}"; do
    declare -n p="dir_$i"
    dir_ml+=( "$p" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

在上面的循环中,将依次$i获取值EN和。GE这还引入了一个名称参考多变的p。当访问 的值时p,声明变量时分配给该变量的字符串将被解释为变量名并返回变量的值。

上面的输出将是

dir_ml = "/xx"
dir_ml = "/zz"

要在 中使用名称引用bash,您需要bash4.3 或更高版本。


另一种(有趣但较差)的可能性:

dir_EN=/xx
dir_GE=/zz

# (can't set dir_ml=() here as its name would be picked up by the loop)
unset dir_ml

for i in "${!dir_@}"; do
    dir_ml+=( "${!i}" )
done

printf 'dir_ml = "%s"\n' "${dir_ml[@]}"

在这里,$i将取以下值变量名 dir_ENdir_GE依次。然后我们使用变量间接with${!i}来获取该变量的值。此变体不需要数组langs,但它假设没有其他变量被命名为dir_-something(这可能被认为有点脆弱,因为用户可以轻松地将具有此类名称的变量注入脚本环境中)。

此代码的输出与上面的代码相同。

答案2

这可以通过以下方式完成:

#!/bin/bash
langs=(EN GE)
dir_EN=/xx
dir_GE=/zz

for i in ${!langs[@]}; do
        temp="dir_${langs[i]}"
        dir_ML[i]=${!temp}
done

首先我已经更改langs="EN GE"langs=(EN GE)因为这需要是一个数组。

我还更改了$(seq 0 1)${!langs[@]}扩展到数组中每个项目的索引(或在关联数组的情况下的名称)。所以在这个例子中0 1

然后我将临时变量设置为dir_${langs[i]}(dir_ENdir_GE)。

然后使用!参数扩展我扩展具有该名称的变量来设置元素dir_ML

相关内容