如何在 bash 中使用 `declare` 设置名称和值取自命令输出的变量?

How to set variables whose name and values are taken from a command's output with `declare` in bash?

我需要在 bash shell 脚本中声明变量,其名称和值均取自另一个命令的输出。

为了这个问题,我将使用一个临时文件tmp

$ cat tmp
var1="hello world"
var2="1"

...并将其用于下面的模拟命令。

最后,我需要将变量 $var1$var2 分别设置为 hello world1,变量名称为 var1 var2 直接取自输入。

这是我目前得到的:

$ cat tmp|while read line; do declare $line; done

我知道我不需要使用 cat,但这是为了模拟输入是从其他命令的输出而不是在文件中获取的事实。

这行不通。我得到:

bash: declare: `world"': not a valid identifier

$ echo $var1; echo $var2


$ 

我不明白为什么这不起作用,因为我可以这样做:

declare var1="hello world"

...预期结果。我以为这是等价的,但我显然错了。

我发现 最接近我的问题,但不是很接近,因为它依赖于源文件。我想避免这种情况。我找到了其他使用 eval 的答案,但我也希望避免使用它。

也许我不理解引号的使用有微妙之处。

如果唯一的方法是使用临时文件并获取它,那我会这样做,但我认为必须有另一种方法。

编写 shell 脚本时的一个好建议是始终对变量加双引号。否则会受到shell分词的影响

while read line; do
    declare "$line"
done < <(echo "var1=hello world")

为什么 echo "var1=hello world" | while read line; do export "$line"; done 不起作用?因为pipe是一个sub-shell,它在子shell中创建了var1,不会影响当前的shell。所以不能设置在当前shell

作为替代方案,使用process substitution,您可以获得作为临时文件的输出。所以它将在当前 shell 中创建变量。