Shell:为什么while循环处理额外的char

时间:2017-11-01 07:24:36

标签: shell

这是我简单的shell脚本

root@Ubuntu:/tmp# cat -n script.sh 
     1  echo
     2  while x= read -n 1 char
     3  do
     4   echo -e "Original value = $char"
     5   echo -e "Plus one = `expr $char + 1`\n"
     6  done < number.txt
     7  echo
root@Ubuntu:/tmp# 

这是number.txt

的内容
root@Ubuntu:/tmp# cat number.txt 
12345
root@Ubuntu:/tmp#

正如您在代码中看到的那样,我正在尝试读取每个数字并单独处理它。在这种情况下,我想为每个添加一个并在新行上打印。

root@Ubuntu:/tmp# ./script.sh 

Original value = 1
Plus one = 2

Original value = 2
Plus one = 3

Original value = 3
Plus one = 4

Original value = 4
Plus one = 5

Original value = 5
Plus one = 6

Original value = 
Plus one = 1


root@Ubuntu:/tmp# 

除最后一行外,一切看起来都很好。我只有5个数字,但似乎代码正在处理额外的数字。

Original value = 
Plus one = 1

问题是这是如何发生以及如何解决的?

1 个答案:

答案 0 :(得分:1)

输入文件number.txt似乎包含一个完整的行,它由换行符(LF)终止。 (您可以使用ls -l验证输入文件是否超过5。)read最终遇到LF并为您提供一个空char(从输入中剥离终止LF,如果没有-n选项)。这将为您expr + 1提供1。您可以明确地测试空char并使用测试-n终止while循环以获取非零长度字符串:

echo "12345" | while read -n 1 char && [ -n "$char" ]; do echo "$char" ; done