Bash中的dynamicvariables名称

我对bash脚本感到困惑。

我有以下代码:

function grep_search() { magic_way_to_define_magic_variable_$1=`ls | tail -1` echo $magic_variable_$1 } 

我希望能够创build一个variables名称,其中包含命令的第一个参数,并带有例如ls的最后一行的值。

所以要说明我想要什么:

 $ ls | tail -1 stack-overflow.txt $ grep_search() open_box stack-overflow.txt 

那么,我该如何定义/声明$magic_way_to_define_magic_variable_$1 ,我应该如何在脚本中调用它?

我试过eval${...}\$${...} ,但我仍然感到困惑。

使用关联数组,命令名称作为关键字。

 # Requires bash 4, though declare -A magic_variable=() function grep_search() { magic_variable[$1]=$( ls | tail -1 ) echo ${magic_variable[$1]} } 

如果您不能使用关联数组(例如,您必须支持bash 3),则可以使用declare来创builddynamicvariables名称:

 declare "magic_variable_$1=$(ls | tail -1)" 

并使用间接参数扩展来访问该值。

 var="magic_variable_$1" echo "${!var}" 

最近我一直在寻找更好的方法。 关联数组听起来像对我来说矫枉过正。 看我发现了什么:

 suffix=bzz declare prefix_$suffix=mystr 

…接着…

 varname=prefix_$suffix echo ${!varname} 

这应该工作:

 function grep_search() { declare magic_variable_$1="$(ls | tail -1)" echo "$(tmpvar=magic_variable_$1 && echo ${!tmpvar})" } grep_search var # calling grep_search with argument "var" 

哇,大部分的语法是可怕的! 如果您需要间接引用数组,则可以使用一些简单的语法来解决这个问题:

 #!/bin/bash foo_1=("fff" "ddd") ; foo_2=("ggg" "ccc") ; for i in 1 2 ; do eval mine=( \${foo_$i[@]} ) ; echo ${mine[@]} ; done ; 

对于更简单的用例,我推荐高级Bash脚本指南中描述的语法 。

下面的例子返回$ name_of_var的值

 var=name_of_var echo $(eval echo "\$$var") 

对于索引数组,可以像这样引用它们:

 foo=(abc) bar=(def) for arr_var in 'foo' 'bar'; do declare -a 'arr=("${'"$arr_var"'[@]}")' # do something with $arr echo "\$$arr_var contains:" for char in "${arr[@]}"; do echo "$char" done done 

关联数组可以被类似地引用,但是需要declare -A开关而不是-a

对于varname=$prefix_suffix格式,只需使用:

 varname=${prefix}_suffix