2017-06-19 73 views
0

我需要在bash shell脚本中声明变量,其中名称和值都是从另一个命令的输出中获取的。如何使用bash中的`declare`在命令的输出中设置其名称和值取自哪个变量?

对于这个问题的缘故,我将使用一个临时文件tmp

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

...,并使用它下面我模拟命令。

最后,我需要有变量$var1$var2组分别与hello world1,与直接从输入采取的变量名和var1var2

这是我走到这一步:

$ 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" 

...与预期的结果。我认为这将是相当的,但我显然是错的。

我发现this answer与我的问题最接近,但并不完全,因为它依赖于文件来源。我想避免这种情况。我发现其他答案使用eval,但我更愿意避免这种情况。

也许在我不明白的引号的使用中有微妙之处。

如果唯一的方法是使用一个临时文件和源代码,那就是我要做的,但我认为必须有另一种方式。

回答

0

编写shell脚本时一个很好的建议是总是双引号变量。否则,它将受到shell分词的影响。

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

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

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

+0

如果OP执行脚本(在子shell上运行) – Inian

+0

这仍然不能解决问题好吧,它不适用于子shell。 @Inian。 – zhenguoli

+0

@zhenguoli恐怕这并不能回答这个问题,因为1)它仍然依赖于一个外部文件,2)如果变量的值有一个“=”符号,它就不起作用。 – Jordan

相关问题