shell脚本无法从sysin读取最后一行。

14 浏览
0 Comments

shell脚本无法从sysin读取最后一行。

我试图从sysin获取一些数据,这是我的问题:如果数据来自文件,则最后一行不会被读取。

文本文件示例:

line1
line2
line3

我的代码:

#!/bin/bash
while read line
do
  echo "$line"
done

输出结果:

$ ./test.sh < data.txt
line1
line2

如果我在文件末尾写下空字符串,输出就会正确。但我不喜欢这样做。

如何修复这个问题?

0
0 Comments

问题的原因是由于输入的文件缺少结尾的换行符。解决方法是在文件的末尾添加换行符,或者在读取文件时处理没有结尾换行符的情况。

有一种方法可以检查文件是否缺少结尾的换行符,可以通过在终端中执行以下命令来查看文件的十六进制表示:

od -xa data.txt

观察结果的结尾部分,如果结尾没有换行符,则需要进行处理。

另一种方法是通过查看文件的内容来判断是否缺少结尾的换行符。在终端中执行以下命令:

$ cat data.txt

如果最后一行显示为%符号,则表示文件缺少结尾的换行符。

解决问题的方法是在文件的末尾添加一个换行符,或者在读取文件时处理没有结尾换行符的情况。这可以通过修改代码来实现。

请注意,添加换行符可能会影响文件的格式或其他处理过程。因此,在进行修改之前,请确保了解对文件的影响,并根据实际需求进行相应的处理。

0
0 Comments

问题:

问题描述:shell脚本无法从标准输入中读取最后一行。

问题原因:在使用shell脚本读取标准输入时,使用read命令读取最后一行时,会出现无法读取的情况。

解决方法:可以通过检查返回的字符串是否为空来判断是否读取到了最后一行,而不是通过检查read命令的退出状态。

解决方案:

如果你迫切需要在没有结束符的情况下读取文件,那么可以通过检查返回的字符串是否为空来判断是否读取到了最后一行,而不是通过检查read命令的退出状态。下面是一个示例的shell脚本:

#!/bin/bash
while true; do
  line=''
  read line
  if [ -z "$line" ]; then
    break
  fi
  echo "$line"
done

这个脚本会持续地从标准输入中读取行,并将每一行打印出来。当读取到最后一行时,会通过检查返回的字符串是否为空来判断是否退出循环。

这种解决方法虽然有效,但代码比实际需要的要冗长得多。

0
0 Comments

(shell script does not read last line from sysin)这个问题出现的原因是在读取标准输入时,如果最后一行没有换行符,脚本将无法读取到最后一行。解决方法是使用一个循环来读取标准输入,并在循环条件中添加一个判断,以确保能读取到最后一行。

具体的解决方法是使用以下代码片段:

while read -r line || [[ $line ]]; do
  : process "$line"
done

这段代码的含义是,在循环中:

- 读取一行文本,并将其赋值给变量line;

- 如果读取成功(即读取到了一个有效的行,需要有换行符),继续执行循环体中的代码;

- 如果读取失败(即读取到了一个不完整的行,没有换行符),但变量line非空,也继续执行循环体中的代码。

这样,无论最后一行是否有换行符,都能保证能读取到最后一行,并正确处理。

通过以上的解决方法,我们可以解决(shell script does not read last line from sysin)这个问题。

0