为什么这个For循环与Bash中的While循环不一样?

Chr*_*uma 3 variables bash loops

好吧,所以我试图解析一个文件,在列中输出我需要的行,我不能让这个while循环工作,我真的很难过.

有趣的是,用for循环做几乎完全相同的事情确实有效.有人可以解释一下这里发生了什么吗?

这个...

e=""
for f in 1 2 3
do 
    echo $f 
    e="$e.$f"
done
echo $e
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
.1.2.3
Run Code Online (Sandbox Code Playgroud)

但是这个...

e=""
echo "1
2
3" | while read f
do 
    echo $f 
    e="$e.$f"
done
echo $e
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
Run Code Online (Sandbox Code Playgroud)

显然,$f当它们到达时,两个循环都有1,2或3个e="$e.$f",所以第二个循环不起作用的是什么?

Phi*_*ing 8

我不能告诉你有多少次我不得不从某人的代码中提取这个错误.

管道基本上会产生分叉过程.e在forked进程中设置,但是当它终止时(在wile循环结束时),父进程不知道e已经改变.简而言之,永远不要在涉及管道的命令中设置变量.管道完成后不会设置.更短......如果可以避免,不要使用管道.

e=''
while read f
do
  echo $f
  e="$e.$f"
done << EOF
1
2
3
EOF
echo $e
Run Code Online (Sandbox Code Playgroud)