2015-11-25 37 views
1

我想定义一个函数defvar定义的变量,例如我可以根据函数参数轻松定义一个变量吗?

defvar FOO BAR ## equivalent to FOO=BAR 

然而,定义这样的功能不工作的简单的方式(因为壳结束执行整个字符串作为单个命令presumedly?)解决此

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

的一种方法是明确地执行作为export调用的一部分的分配,例如

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

这在我的本地bash壳的作品,但它听起来像这可能not be portable,并且可能无法在一些较旧的贝壳工作。

是否有实现这个便携式机制?

+0

*应*便携,在这个词的使用感。 – chepner

+0

我不认为这将在原Bourne shell中工作,但希望您可以在POSIX(+)兼容性上画线。呃..不知道有关'灰烬'或'破折号'......任何人?祝你好运。 – shellter

+2

使用导出的问题并不在于缺乏可移植性,而是它比赋值shell变量更多,即defvar正在尝试执行的操作。另外,它还将其标记为环境变量,即它输出变量。 – jlliagre

回答

0

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

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

我们构造语句中使用函数的参数,例如评估"$1='$2'",然后评估构造的字符串(从而执行分配)。

由于eval由POSIX标准定义,它是关于便携,因为它得到。它似乎甚至可以在heirloom bourne shell上工作,所以我想这种方法甚至可以在那些更老的炮弹上工作。

也就是说,使用eval是那种恶心的,因为有人会写这样的:

defvar FOO "'; echo Ouch; '" 

也就是说,很容易用它来执行任意代码,因此用户可以在本应只与值得信赖的运行输入或消毒/验证输入。

相关问题