这是我的 bash 案例:
第一种情况,这就是我想要做的“别名var
” myvarA
:
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,您将获得原始数组中的实际数字或元素。在这两种情况下,我们基本上都会创建一个新数组。