我的somelist.txt
文件包含以下内容:
a
b
c
使用下面的循环不会在c
中返回listing
。但是如果我在c
之后按下ENTER(新行),循环将完全正确地读取它。有没有办法让它读取最后一行,而不需要在c
后有新行?
somelist.txt
有效:
a
b
c
(empty line)
代码:
while read list; do
listing="$list"
done <somelist.txt
echo $listing
答案 0 :(得分:1)
在处理您正在阅读的文件不包含POSIX文件结尾的可能性时。 (意味着它有可能缺少最终'\n'
),然后处理解析文件的正确方法是在read语句中添加一个检查,以测试最终读取是否填充了$list
。例如:
while read -r list || [ -n "$list" ]; do
echo "$list"
done <somefile.txt
您可以使用任何您喜欢的测试构造,bash [[ ... ]]
或旧的test -n "$list"
(相当于[ ... ]
)。
这样无论你是否有POSIX eof,你都会读到所有的行。 (大多数现代编辑都强制执行POSIX eof,但仍然有很多不支持)
答案 1 :(得分:0)
您需要模仿cat
。见http://mywiki.wooledge.org/BashFAQ/001
while IFS= read -r list;
do
listing="$list";
done < somelist.txt;
[[ -n "$listing" ]] && echo "$listing"
这将打印:c
。
要打印所有这些内容,请在echo
内使用loop
。
while IFS= read -r list;
do
echo "$list";
done < somelist.txt;
[[ -n $list ]] && echo "$list"
结果:
a
b
c
答案 2 :(得分:-2)
您正在使用“&lt;”运营商。所以它最终没有到达char。当它到达最后。打破循环。只需改变操作&lt;并使用“=”。并检查