从 bash 脚本内部进行变量赋值

从 bash 脚本内部进行变量赋值

这显然是一个 SSCCE,所以它(本身)没有任何意义。例如Y,在这个最小的例子中没有使用变量赋值;我只是想找出适用于我的实际情况的正确语法。

我可以直接在 bash shell 上执行以下操作:

Y=10 echo foo

我还可以在 bash 文件中包含以下内容foo.sh

#!/bin/bash
X="echo foo"
$X

...然后执行:

$./foo.sh
foo

但是,当我的 bash 文件中有以下内容时:

#!/bin/bash
X="Y=10 echo foo"
$X

...然后,我得到:

$ ./foo.sh 
./foo.sh: line 3: Y=10: command not found

上述内容的正确语法是什么?

答案1

问题是可选参数分配被识别发生参数扩展,因此该行

$X

被识别为没有前面分配的命令。假定扩展结果的第一个单词是命令名称,因此 shell 尝试运行Y=10.

通常情况下,您不应尝试将代码存储在变量中,而应存储在函数中。

X () {
    Y=10 echo foo
}

答案2

事实证明,我下面描述的只是最小示例的产物,其中省略了Y使用的部分。

该行中的命令之前有一个变量赋值:

Y=10 echo foo

该赋值操作将在执行期间将变量设置Y为。因为没有使用,所以赋值没有效果。10echo fooecho fooY

在问题和答案中该命令的所有变体中,这是相同的 -Y=10在那里没有效果。

答案3

如果您必须这样做,请使用env

$ X='env Y=10 echo foo'
foo

...并展示$Y...

$ X='env Y=10 env'
$ $X | grep \^Y
Y=10

...但是函数更好。

答案4

发生参数扩展后再次解析命令的方法是

X="Y=10 echo foo"
eval "$X"

我假设您有一个现实的理由想要这样做。

相关内容