bash - 在单个管道阶段设置多个变量

时间:2011-12-20 17:16:38

标签: bash shell scripting

我希望做类似的事情:

echo 1 2 | read foo bar

将两个新变量foo和bar分别设置为值1和2。 (实际上,“echo 1 2”将是外部数据源的awk / cut调用。)

我发现foo和bar在此行之后不存在,这让我想知道它是否是一个范围问题?我只使用read in while循环,在这种情况下循环体能够访问变量。

4 个答案:

答案 0 :(得分:3)

管道在子shell中执行。因此,创建变量foobar,将1和2存储在其中,然后子shell退出并返回到不存在这些变量的父shell。

read变换为您想要的变量的一种方法是使用" here string"

read foo bar <<<"1 2"

您可以按预期管道版本执行此操作。

然而,这是不可移植的,有些shell不支持它。您可以使用&#34; here document&#34;而是形式,广泛支持。

$ read foo bar <<EOF
> 1 2
> EOF

请注意,EOF此处可以是任何唯一字符串。这里的文档将存储所有行,直到包含EOF的行,或者您选择的任何标记,而不包含任何其他行。在这种情况下,行为也与前面的示例相同(但更难以复制和粘贴,而且更难以键入)。

这里发生了什么?

&#34; here here&#34;和#34; here string&#34;是表示传递给标准输入的文本而不必以交互方式输入的方法。它在功能上等同于只说read foo bar,按Enter键,然后手动编写1 2并再次按Enter键。

答案 1 :(得分:2)

而不是管道,你可以做这样的事情 -

[jaypal:~/Temp] exec 3< <(echo "Jaypal Singh")
[jaypal:~/Temp] while read word1 word2 ; do echo "$word1 $word2"; done <&3
Jaypal Singh

[jaypal:~/Temp] exec 3< <(echo "Jaypal Singh")
[jaypal:~/Temp] while read word1 word2 ; do echo "$word1"; done <&3
Jaypal

答案 2 :(得分:0)

谢谢bash在管道时运行子shell,现在我们不能同时读取多个变量了!

  

grep -w regexp文件|读var1 var2 var3

没有替代此KSH功能的解决方案。解决方案:

  

'read&lt;&lt;&lt; $(命令)”   是bourne和korn shell不兼容。

答案 3 :(得分:0)

另一种简单的解决方案-在某些情况下可能会有用:

echo 1 2 | { read foo bar; echo $foo $bar; }

当然,就像最初的问题一样,echo命令可能会有更复杂的处理。