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