我需要在bash shell脚本中声明变量,其中的名称和值都取自另一个命令的输出。
为了这个问题,我将使用一个临时文件tmp
:
$ cat tmp
var1="hello world"
var2="1"
...并将其用于我下面的模拟命令。
最后,我需要将变量$var1
和$var2
分别设置为hello world
和1
,变量名称为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"
的答案,但我也希望避免这样做。
使用我不理解的引号时可能存在细微之处。
如果唯一的方法是使用临时文件并将其作为我将要做的来源,但我认为必须采用另一种方式。
答案 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.