You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

bash脚本read循环为何跳过首行输入?添加cat修复的原理

问题原因解析

先看你的原脚本:

#!/bin/bash

while read line;
do
    cat
done

原脚本丢首行的原因

  1. 脚本启动后,while read line会先执行一次read操作,把标准输入的第一行内容读到line变量里,但这行内容没有被任何命令输出。
  2. 进入循环体后,cat会读取标准输入里剩下的所有内容(从第二行到结尾)并直接打印。
  3. 等cat读完剩余内容,while循环再次执行read line时,标准输入已经到了末尾(EOF),read返回非0状态,循环直接退出。
  4. 最终结果就是第一行被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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:10:32