bash脚本read循环为何跳过首行输入?添加cat修复的原理
问题原因解析
先看你的原脚本:
#!/bin/bash while read line; do cat done
原脚本丢首行的原因
- 脚本启动后,
while read line会先执行一次read操作,把标准输入的第一行内容读到line变量里,但这行内容没有被任何命令输出。 - 进入循环体后,
cat会读取标准输入里剩下的所有内容(从第二行到结尾)并直接打印。 - 等
cat读完剩余内容,while循环再次执行read line时,标准输入已经到了末尾(EOF),read返回非0状态,循环直接退出。 - 最终结果就是第一行被
read“吃掉”却没输出,后面的行被cat正常打印。
前置cat能解决的原因
如果你在循环前加了cat,脚本变成这样:
#!/bin/bash cat while read line; do cat done
这个前置的cat会直接读取标准输入的全部内容并打印,执行完后标准输入已经没有剩余内容了。后面的while read line因为读不到任何内容,循环根本不会启动——相当于整个脚本的功能变成了单纯的cat,自然所有行都能正常输出。
更合理的写法
如果确实需要逐行处理输入,正确的写法应该是在循环里输出line变量,而不是嵌套cat:
#!/bin/bash while read line; do echo "$line" done
这样每一行被read存入line后,都会通过echo输出,不会丢失任何行。
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

