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; '"