Aar*_*aid 7 bash shell newline built-in
在 bash 中,这是有效的:
echo -n $'a\nb\nc\n' | while read x; do echo = $x =; done
Run Code Online (Sandbox Code Playgroud)
while循环3次
= a =
= b =
= c =
Run Code Online (Sandbox Code Playgroud)
但想象一下一个没有传统尾随换行符的文本文件。我认为这read
应该仍然适用于所有三行,但事实并非如此。我刚刚得到:
echo -n $'a\nb\nc' | while read x; do echo = $x =; done
= a =
= b =
Run Code Online (Sandbox Code Playgroud)
bash 中的内容help read
并没有真正澄清。
注意:我不需要解决这个问题,我可以自己找到一些方法来修复它。我很好奇,并且很想提交错误报告 - 我通常会尝试尊重可能没有尾随新行的文件。我在使用 -d 选项读取时遇到了这一点。read -d " "
将按空格而不是换行符进行分割,但它会错过最后一个条目,除非它有尾随空格。
(Ubuntu。GNU bash,版本 4.1.5(1)-发布)
如果您希望上述循环处理不完整的行,请执行以下操作:
echo -n $'a\nb\nc' | while read x || [[ $x ]]; do echo = $x =; done
Run Code Online (Sandbox Code Playgroud)
这使:
= a =
= b =
= c =
Run Code Online (Sandbox Code Playgroud)
当read
遇到不完整的行时,它会将其读入变量(x
在本例中),但返回一个非零退出代码,该代码将结束循环,并|| [[ $x ]]
负责运行不完整行的循环。下次调用时read
,没有任何内容可读取,并且以 1 退出,x
也设置为空字符串,这确保我们结束循环。
$ man bash
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
One line is read from the standard input, ...
Run Code Online (Sandbox Code Playgroud)
我认为关键是:How to define "One line"
。做
吗?
我想不这么认为。text without a '\n' at the end
One line
read
归档时间: |
|
查看次数: |
2478 次 |
最近记录: |