我希望做类似的事情:
echo 1 2 | read foo bar
将两个新变量foo和bar分别设置为值1和2。 (实际上,“echo 1 2”将是外部数据源的awk / cut调用。)
我发现foo和bar在此行之后不存在,这让我想知道它是否是一个范围问题?我只使用read in while循环,在这种情况下循环体能够访问变量。
答案 0 :(得分:3)
管道在子shell中执行。因此,创建变量foo
和bar
,将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
命令可能会有更复杂的处理。