繁体   English   中英

在 bash 中传递给函数的变量名

[英]Name of variable passed to function in bash

bash 中有没有办法理解传递给它的变量的名称?

例子:

var1=file1.txt
err_var=errorfile.txt

function func1 {
   echo "func1: name of the variable is: " $1
   echo "func1: value of variable is: " $1 
   echo
   if [ ! -e $var1 ]
   then
      $1 = $err_val  #is this even possible?
   fi
   func2 $1
}

function func2 {
   echo "func2: name of the variable is: " $1
   echo "func2: value of variable is: " $1 
   echo
}

func1 $var1
func1 $err_var

如果 file1.txt 存在,我希望得到以下输出:

func1: name of the variable is: var1
func1: value of variable is: file1.txt

func2: name of the variable is: var1
func2: value of variable is: file1.txt

当 file1.txt 不存在时:

func1: name of the variable is: var1
func1: value of variable is: file1.txt

func2: name of the variable is: err_var
func2: value of variable is: errorfile.txt

有任何想法吗?

不,变量在函数看到它之前被扩展。 该函数只看到值,而不是变量名。

如果传递未扩展且没有美元符号的变量名,则可以使用间接。

get_it () {
    echo "${!1}"
}

演示:

$ foo=bar
$ baz=qux
$ get_it foo
bar
$ get_it baz
qux

就像丹尼斯说的那样,一旦你使用美元符号扩展了变量,你的函数就不再有办法获取变量名了。 但是我认为您还询问了一种设置变量值的方法,而该部分尚未得到解答。 有一些不可移植的方法可以做到这一点,例如declare -n (如果您感兴趣,请使用 Google),但我的答案将坚持通用解决方案。

我是一名C++程序员,所以我喜欢模仿“ getter 和 setter ”的哲学,在那里你使用微小的函数来获取和设置变量的值。 使用 getter 和 setter 的缺点是您需要为每个要管理的值创建一个函数(或两个函数)。 所以......我做了一个“工厂函数”来为你创建 getter/setter:

makeGetSet() {
. /dev/fd/0 <<END_FUNC
${1}Val()  { [ "\${1}" ] && ${1}="\${1}" || echo "\${${1}}"; }
END_FUNC
}

它不需要任何具有特殊功能的特定 shell,如间接或namerefsdeclare实用程序。 没有eval ,没有alias ,只有 100% POSIX。 您只需将变量名称传递给makeGetSet ,并且您的 getter/setter 函数具有相同的名称,末尾带有“ Val ”(例如myVariableVal )。 bashdash测试。 您可以继续使用“普通”shell 方式结合我的函数来读/写变量。

用法:

Setup: makeGetSet myVariable
Set: myVariableVal newValue
Get: anotherVariable="`myVariableVal`"
Print: myVariableVal

我不确定你脚本的几个部分,所以我做了一些有根据的猜测。 if [ ! -e $var1 ] if [ ! -e $var1 ] ,我想你的意思是if [ ! -e $1 ] if [ ! -e $1 ] 最后,在你调用函数的地方,你有func1 $var1func1 $err_var ,但我认为你打算只使用func1 $var1或有第三个变量。 看起来$err_var是“错误的默认值”,而不是您作为输入提供的内容,但也许我没有遵循您的想法。

所以我对你的问题的回答如下:

var1=file1.txt; makeGetSet var1
err_var=errorfile.txt; makeGetSet err_var

function func1 {
   echo "func1: name of the variable is: " ${1%Val}
   echo "func1: value of variable is: " `${1}`
   echo
   # Shorter than if..fi
   [ ! -e `${1}` ] && ${1} ${err_val}
   func2 ${1}
}

function func2 {
   echo "func2: name of the variable is: " ${1%Val}
   echo "func2: value of variable is: " `${1}` 
   echo
}

func1 ${var1}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM