技术提示:在 Bash 函数中取消引用变量名
发布于 2010 年 1 月 15 日
我们经常读到(包括在 Mendel Cooper 的著作 Advanced Bash-Scripting Guide 中),如果我们将变量名作为参数传递给函数,它们将被视为字符串文字,并且无法取消引用(即,该值不可用)。但事实并非如此,变量名可以作为参数传递给函数,并且可以取消引用以获得具有给定名称的变量的值。
以下脚本演示了这一点
DerefernceVariablePassedToFunction() { if [ -n "$1" ] ; then echo "value of [${1}] is: [${!1}]" else echo "Null parameter passed to this function" fi } Variable="LinuxJournal" DerefernceVariablePassedToFunction Variable
如果我们把上面的代码放在一个文件中并运行它,我们会得到如下输出
$ /bin/bash DereferenceVarInFunction.sh value of [Variable] is: [LinuxJournal]
这里的秘密是 "!" 在变量扩展 "${!1}" 中使用。 Bash 手册指出
如果参数的第一个字符是感叹号,则会引入一级变量间接引用。 Bash 使用由参数其余部分形成的变量的值作为变量的名称;然后扩展该变量,并将该值用于其余的替换,而不是参数本身的值。 这被称为间接扩展。