技术提示:在 Bash 函数中取消引用变量名

我们经常读到(包括在 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 使用由参数其余部分形成的变量的值作为变量的名称;然后扩展该变量,并将该值用于其余的替换,而不是参数本身的值。 这被称为间接扩展。
加载 Disqus 评论