我可以基于函数参数移植定义变量吗?

时间:2015-11-25 23:02:17

标签: shell sh

我想定义一个定义变量的函数defvar,例如

defvar FOO BAR  ## equivalent to FOO=BAR

然而,定义这样一个函数的天真方式不起作用(假设因为shell最终将整个字符串作为单个命令执行?)

defvar () { $1=$2; } ## no dice

解决此问题的一种方法是明确执行作为export调用的一部分的分配,例如

defvar () { export $1=$2; } ## works, but not portable to some older shells

适用于我的本地bash shell,但听起来可能not be portable,并且可能无法在某些较旧的shell上使用。

是否有便携式机制来实现这一目标?

1 个答案:

答案 0 :(得分:0)

我们可以使用eval解决此问题:

defvar () {
    eval "$1='$2'"
}

我们构造一个语句来使用函数参数进行评估,例如: "$1='$2'",然后评估构造的字符串(从而执行赋值)。

由于eval是由POSIX标准定义的,因此它具有可移植性。它似乎甚至可以在heirloom bourne shell上运行,所以我想这对于那些旧的炮弹都会起作用。

那就是说,使用eval有点蠢,因为有人可以这样写:

defvar FOO "'; echo Ouch; '"

也就是说,使用它来执行任意代码很容易,所以这应该只使用可信输入或清理/验证输入来运行。