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

Shell 我可以基于函数参数移植定义变量吗?,shell,sh,Shell,Sh,我想定义一个函数defvar,它定义了一个变量,例如 defvar FOO BAR ## equivalent to FOO=BAR 但是,定义这样一个函数的简单方法不起作用(假定是因为shell最终将整个字符串作为单个命令执行?) 解决此问题的一种方法是在export调用中显式执行赋值,例如: defvar () { export $1=$2; } ## works, but not portable to some older shells 这在我的本地bashshell中有效,但听起

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

defvar FOO BAR  ## equivalent to FOO=BAR
但是,定义这样一个函数的简单方法不起作用(假定是因为shell最终将整个字符串作为单个命令执行?)

解决此问题的一种方法是在
export
调用中显式执行赋值,例如:

defvar () { export $1=$2; } ## works, but not portable to some older shells
这在我的本地
bash
shell中有效,但听起来像是这样,在一些旧的shell上可能不起作用

是否有一种可移植的机制来实现这一点?

我们可以使用以下方法解决此问题:

我们使用函数参数构造一个要求值的语句,例如,
“$1='$2'
,然后求值构造的字符串(从而执行赋值)

因为它是由POSIX标准定义的,所以它的可移植性非常好。它似乎甚至可以在外壳上工作,所以我想它甚至可以在更旧的外壳上工作

这就是说,使用
eval
有点讨厌,因为有人可能会写以下内容:

defvar FOO "'; echo Ouch; '"
也就是说,可以很容易地使用它来执行任意代码,因此这应该只使用受信任的输入或经过净化/验证的输入来运行。

我们可以使用以下方法解决此问题:

我们使用函数参数构造一个要求值的语句,例如,
“$1='$2'
,然后求值构造的字符串(从而执行赋值)

因为它是由POSIX标准定义的,所以它的可移植性非常好。它似乎甚至可以在外壳上工作,所以我想它甚至可以在更旧的外壳上工作

这就是说,使用
eval
有点讨厌,因为有人可能会写以下内容:

defvar FOO "'; echo Ouch; '"

也就是说,使用它来执行任意代码很容易,因此,要么只应使用受信任的输入运行,要么使用经过净化/验证的输入运行。

从有用的意义上讲,这是可移植的。我认为这在原始Bourne shell中不起作用,但希望您能够在POSIX(+)兼容性方面划清界限。陛下不确定是否使用了
ash
dash
。。。任何人祝你好运。使用export的一个问题并不是缺乏可移植性,而是它所做的不仅仅是分配一个shell变量,即defvar试图做的事情。此外,它还将其标记为一个环境变量,即它导出该变量。从有用的意义上讲,这是可移植的。我认为这在最初的Bourne shell中不起作用,但希望您能够在POSIX(+)兼容性上划清界限。陛下不确定是否使用了
ash
dash
。。。任何人祝你好运。使用export的一个问题并不是缺乏可移植性,而是它所做的不仅仅是分配一个shell变量,即defvar试图做的事情。此外,它还将其标记为环境变量,即导出该变量。
defvar FOO "'; echo Ouch; '"