不确定我在标题中使用的词语是否正确,我正在尝试这样做:
while read line; do
echo "$line"
exit;
done; <( echo "foo\n"; exit )
但它挂起,我认为while
循环没有从进程中获取任何输入echo
。有谁知道这样做的正确方法以及为什么这是错误的?
我可以这样做:
echo "foo" | while read line; do echo "$line"; done;
但我希望采用第一种方式只是为了学习目的。我不确定是否需要流程替换。
答案1
如果您的脚本在循环之后继续并想要处理${line}
.
去掉分号,并在done
和 进程替换之间放置输入重定向:
done < <( echo "foo\n"; exit )
请注意,您不需要显式地exit
终止进程替换的执行。
然而,对于文本文件处理,通常使用sed
或更好、更安全awk
,这也会产生更好的性能。如果您确实必须使用 Bash 来处理文本行,通常是非常建议这样做:(仅显示循环的第一行)
while IFS= read -r line ; do
除非你真的知道你需要别的。
这是对包含空格、换行符和反斜杠的输入行进行原始处理所必需的,否则 Bash 会解析、压缩和解释为(分别)分隔符和转义字符。