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

时间:2017-06-19 13:38:33

标签: bash declare

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

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

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

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

最后,我需要将变量$var1$var2分别设置为hello world1,变量名称为var1和{ {1}}直接从输入中获取。

这是我到目前为止所得到的:

var2

我知道我不需要使用$ cat tmp|while read line; do declare $line; done ,但这是为了模拟输入来自另一个命令的输出而不是文件中的事实。

这不起作用。我明白了:

cat

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

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

$ echo $var1; echo $var2


$ 

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

我发现this answer与我的问题最接近,但不完全是因为它依赖于文件来源。我想避免这种情况。我找到了其他使用declare var1="hello world" 的答案,但我也希望避免这样做。

使用我不理解的引号时可能存在细微之处。

如果唯一的方法是使用临时文件并将其作为我将要做的来源,但我认为必须采用另一种方式。

1 个答案:

答案 0 :(得分:0)

A good suggestion when writing a shell script is that always double quoting the variable. Otherwise, it will be affected by the shell word splitting.

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

And why echo "var1=hello world" | while read line; do export "$line"; done won't work? Because pipe is a sub-shell, it creates var1 in the sub-shell, it won't impact the current shell. So it can't be set in the current shell.

As an alternative, use process substitution, you can obtain the output as a temporary file. So it will create the variable in the current shell.