可移植地为动态命名的 shell 变量赋值

Gre*_*bet 6 shell

Slackware 14.2 上的 Almquist shell,但不是 Debian 的 Almquist shell,支持以下构造。其他类似伯恩的炮弹没有。

setvar "$varname" <...>
Run Code Online (Sandbox Code Playgroud)

Bash 显然具有动态创建变量名的能力

declare "magic_variable_$1=$(ls | tail -1)"
Run Code Online (Sandbox Code Playgroud)

我认为对可以出现的字符有一些限制$1......(=想到)。

建议将此作为在 4.0 之前的 Bashes 中伪造关联数组的解决方法。

我可以想出一个愚蠢的函数,使用eval.

注意:不要以任何理由使用此功能,这是完全不安全的。

assign_dynamically() {
    eval "$1='$2'"
}
Run Code Online (Sandbox Code Playgroud)

但是,如果该值$2包含'但不支持 中的空格或元字符$1,则这件事会令人窒息,因此它不是解决方案。

是否有一种可移植/POSIX 兼容的方法来编写一个函数,该函数分配给$2一个名为变量的变量,$1而不管任一字符串的内容如何?

ica*_*rus 5

不管任何一个字符串,都没有。第一个参数需要是一个有效的变量名。

dynamic_assign(){ eval "$1"=\"\$2\" ; }
Run Code Online (Sandbox Code Playgroud)

和你会得到的一样好

  • 是的。重要的是要注意,这里的 `$2` 字面传递给了 `eval`,而在 OP 的 `eval "$1='$2'"` 中,`$2` 的 _expansion_ 被传递给了 `eval`,这不是你想要的并且是危险的。 (3认同)