我想定义一个定义变量的函数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上使用。
是否有便携式机制来实现这一目标?
答案 0 :(得分:0)
我们可以使用eval
解决此问题:
defvar () {
eval "$1='$2'"
}
我们构造一个语句来使用函数参数进行评估,例如: "$1='$2'"
,然后评估构造的字符串(从而执行赋值)。
由于eval
是由POSIX标准定义的,因此它具有可移植性。它似乎甚至可以在heirloom bourne shell上运行,所以我想这对于那些旧的炮弹都会起作用。
那就是说,使用eval
有点蠢,因为有人可以这样写:
defvar FOO "'; echo Ouch; '"
也就是说,使用它来执行任意代码很容易,所以这应该只使用可信输入或清理/验证输入来运行。