我尝试从 sysin 获取一些数据,这是我的问题:如果数据是从文件中定向的,则不会读取最后一行。文本文件示例:
line1
line2
line3
我的代码:
#!/bin/bash
while read line
do
echo "$line"
done
并输出:
$ ./test.sh < data.txt
line1
line2
如果我在文件末尾写下空字符串输出正确。但我不喜欢它。如何解决这个问题?
这方面的成语是:
while read -r line || [[ $line ]]; do
: process "$line"
done
因此,我们在循环中继续,而:
如果你最后迫切需要读取没有 EOL 的文件,那么你可以检查返回的字符串是否为空,而不是检查read
退出状态:
#!/bin/bash
while true; do
line=''
read line
if [ -z "$line" ]; then
break
fi
echo "$line"
done
我打赌你 data.txt 缺少一个尾随换行符,请尝试检查
od -xa data.txt
看看最后:
$ od -xa data.txt
0000000 696c 656e 0a31 696c 656e 0a32 696c 656e
l i n e 1 nl l i n e 2 nl l i n e
0000020 0033
3
0000021
如果您看到上面的内容,则说明您缺少换行符。
$ od -xa data-with-nl.txt
0000000 696c 656e 0a31 696c 656e 0a32 696c 656e
l i n e 1 nl l i n e 2 nl l i n e
0000020 0a33
3 nl
0000022
%
如果缺少尾随换行符,某些 shell 也会显示一个符号,请尝试:
$ cat data.txt
line1
line2
line3%
$