Bash eval 数组变量名

Bash eval 数组变量名

这是我的 bash 案例:

第一种情况,这就是我想要做的“别名varmyvarA

myvarA="variableA"
varname="A"
eval varAlias=\$"myvar"$varname
echo $varAlias

数组变量的第二种情况并循环其成员,这很简单:

myvarA=( "variableA1" "variableA2" )
for varItem in ${myvarA[@]}
do
    echo $varItem
done

现在不知怎的,我需要使用像示例 1 这样的“别名”技术,但这次是针对数组变量:

eval varAlias=\$"myvar"$varname
for varItem in ${varAlias[@]}
do
    echo $varItem
done

myvarA但对于最后一种情况,仅打印第一个成员,即eval评估变量的值,我应该如何处理 var 数组变量,以便eval评估为数组变量的名称不是变量的值

答案1

参数扩展的最简单形式是:${parameter}
在混淆的情况下使用大括号是更好的方法。

考虑到“myvarA”数组中包含空格的可能性,我认为这就是答案。

#!/bin/bash -x
myvarA=( "variable  A1" "variable  A2" )
varname="A"

eval varAlias=( '"${myvar'${varname}'[@]}"' )
eval varAlias=( \"\${myvar${varname}[@]}\" ) # both works
for varItem in "${varAlias[@]}" # double quote and `@' is needed
do
    echo "$varItem"
done

答案2

在你的答案中,varAlias不是一个数组,所以你可以做for varItem in $varAlias的只是进行分词。因此,如果任何原始数组元素包含空格,它们将被视为单独的单词。

您可以像这样进行标量间接寻址:a=42; b=a; echo ${!b}

您可以像这样间接访问标量数组:

$ j=42; k=55; m=99
$ a=(j k m)
$ echo ${!a[1]}
55

不幸的是,没有令人满意的方法来执行您尝试执行的数组间接类型。您应该能够重新编写代码,这样就不需要间接的了。

也可以看看BashFAQ/006

答案3

我解决了;最后一个例子应该是这样的:

eval varAlias=\${"myvar"$varname[@]}
for varItem in ${varAlias[@]}
do
    echo $varItem
done

答案4

只是要注意,上面接受的答案并不完整。要进行实际的数组分配,您在原始数组周围缺少括号,否则您仍然会得到一个大小为 1 的新数组

我的意思是:

eval varAlias=\${"myvar"$varname[@]}

应改为:

eval varAlias=(\${"myvar"$varname[@]})

您可以通过两种情况并运行来验证这一点:

echo ${#varAlias[@]}

在原始情况下,您将在括号中得到 1,您将获得原始数组中的实际数字或元素。在这两种情况下,我们基本上都会创建一个新数组。

相关内容