Linux 命令行入门学习资料 day_5
diff命令与命令行自动化比对一、为什么学diff—— 比对是调试和测试的核心在编程学习或项目开发中我们经常需要做一件事检查程序的输出是不是和预期的一样。你写了一个 C 程序运行后输出一段文本你想知道它和正确答案有没有区别。你修改了代码想确保修改后的输出和修改前完全一致回归测试。你要批改作业或自动判题需要让计算机自动比较结果。diff就是 Linux 下用来逐行比较两个文件差异的标准工具。掌握了它你就拥有了命令行自动化比对的能力。二、diff是什么—— 逐行比较的利器diff是difference的缩写。它的作用是给定两个文件找出它们有哪些行不同并以一定的格式显示出来。基本用法diff文件1 文件2如果两个文件完全相同diff不会输出任何东西静默。如果有差异它会显示哪些行需要修改才能让文件1变成文件2。三、最简单的例子两个文本文件的比较我们创建两个文件来感受一下。echoapplea.txtechobananab.txt然后比较diffa.txt b.txt输出1c1 apple --- banana解读第一行1c1表示“文件1的第1行改变cchange成文件2的第1行”。开头的是文件1的内容开头的是文件2的内容。如果改成相同内容echoappleb.txtdiffa.txt b.txt没有任何输出说明两文件完全相同。四、把程序输出“抓”出来 —— 重定向与预期结果文件自动化比对的关键一步是把程序输出保存到文件里。你之前学过运行程序用./hello但输出只是显示在屏幕上。要想让diff比较必须把它存成一个文件。方法输出重定向./hellomy_output.txt# 将标准输出保存到 my_output.txt覆盖./hellomy_output.txt# 追加到文件末尾预期结果文件你事先准备好的、正确无误的输出文件通常叫expected.txt。比如echoHello, Linux!expected.txt然后编译你的程序并运行把实际输出保存gcc hello.c-ohello ./helloactual.txt用diff比较diffexpected.txt actual.txt没有输出说明程序输出完全符合预期。如果有差异diff会打印出哪里不一样。五、自动化比对的基础diff的退出状态码在自动化脚本里我们不能用人眼去看有没有输出而要通过程序的退出码来判断是否相同。diff发现文件相同退出码为 0diff发现文件不同退出码为 1diff遇到错误如文件不存在退出码为 2查看退出码diffexpected.txt actual.txtecho$?# 显示上一条命令的退出码在 Shell 脚本里我们可以这样用ifdiffexpected.txt actual.txt/dev/null;thenecho测试通过elseecho测试失败fi /dev/null是丢弃diff的输出我们只关心退出码。六、diff常用选项详解打造你的比对工具箱1.-u—— 统一格式Unified format这是最常用、最易读的格式也是 Git 等工具使用的格式。diff-u文件1 文件2输出会显示上下文-号开头为旧文件行号开头为新文件行。示例diff-uexpected.txt actual.txt--- expected.txt 2025-01-01 12:00:00 actual.txt 2025-01-01 12:00:00 -1 1 -Hello, Linux! I can use gcc!一目了然要变成 actual.txt需要把“Hello, Linux!”替换为“I can use gcc!”。2.-c—— 上下文格式Context format类似-u但风格不同较早使用。diff-cfile1 file23.-y—— 并排显示Side by side将两个文件的内容左右并排显示中间用符号指示差异。diff-yfile1 file2|表示该行有差异表示只在左边文件存在表示只在右边文件存在适合在宽终端下快速扫视。4.-q—— 只报告是否相同Quiet不显示具体差异只根据退出码告诉你文件是否不同。diff-qfile1 file2如果相同无输出如果不同输出Files file1 and file2 differ。5.-s—— 报告相同Report identical当文件相同时给出明确消息。常与-q组合用。diff-sfile1 file2输出Files file1 and file2 are identical。6.-w—— 忽略空白差异有时程序输出多了一些空格或空行但实质没错。-w会忽略所有空白字符的差异。diff-wfile1 file27.-B—— 忽略空行差异忽略只包含空行的增删。七、自动化比对实战写一个测试脚本假设我们的 C 程序add计算两个数的和我们想自动测试多组数据。目录结构test/ ├── add.c ├── add (编译好的可执行文件) ├── test.sh (自动化测试脚本) ├── tests/ │ ├── 1.in (输入文件) │ ├── 1.out (预期输出) │ ├── 2.in │ └── 2.out测试脚本test.sh示例#!/bin/bash# 自动化测试脚本PASS0FAIL0foriin12;doechoRunning test$i..../addtests/$i.intests/$i.actualifdiff-qtests/$i.out tests/$i.actual/dev/null;thenechoTest$iPASSEDPASS$((PASS1))elseechoTest$iFAILEDechoExpected:cattests/$i.outechoGot:cattests/$i.actualFAIL$((FAIL1))fidoneechoechoResults:$PASSpassed,$FAILfailed解读 tests/$i.in将输入文件的内容重定向给程序相当于你在键盘输入。 tests/$i.actual保存实际输出。diff -q静默比较只看退出码。如果失败我们手动打印预期和实际方便调试。运行脚本chmodx test.sh ./test.sh这就实现了一个最简单的自动化判题系统。八、配合make或gcc进行全自动测试在 Makefile 里也可以集成测试目标test: add for i in 1 2; do \ ./add tests/$$i.in tests/$$i.actual; \ if diff -q tests/$$i.out tests/$$i.actual /dev/null; then \ echo Test $$i PASS; \ else \ echo Test $$i FAIL; \ fi; \ done然后执行make test即可一键编译并测试。九、练习题分层动手做基础篇创建两个文件a.txt内容为“red\ngreen\nblue”和b.txt内容为“red\nyellow\nblue”使用diff查看差异。再使用diff -u和diff -y分别查看对比输出格式。将a.txt复制为c.txt用diff a.txt c.txt验证它们相同然后观察echo $?的返回值。用diff -s a.txt c.txt查看输出理解-s的作用。进阶篇程序输出比对编写一个简单的 C 程序greet.c输出Hello, World!。编译后用./greet output.txt保存输出。手动创建expected.txt内容为Hello, World!。用diff output.txt expected.txt判断输出是否正确。故意把expected.txt内容改成Hello, Linux!再次运行diff观察差异。使用diff -w比较两个内容相同但有多余空格或空行的文件验证-w的忽略空白功能。提高篇自动化脚本承接练习4写一个check.sh脚本功能编译greet.c运行./greet output.txt用diff比较output.txt与expected.txt如果相同打印 “PASS”否则打印 “FAIL” 并显示差异用-u格式。设计一个包含多组测试数据的例子编写程序multiply读取两个整数从标准输入输出乘积。准备至少 3 组测试输入文件1.in、2.in、3.in和对应输出文件1.out、2.out、3.out。编写自动化测试脚本test_multiply.sh循环运行并报告通过/失败情况最后统计总数。十、答案与解析基础篇diff a.txt b.txt输出2c2之类的变化。diff -u会显示带-和的统一格式。diff -y左右对照中间会有|标记差异行。echo $?输出0。diff -s a.txt c.txt输出Files a.txt and c.txt are identical。进阶篇正确时diff output.txt expected.txt无输出$?为 0。改错后 diff 会显示差异。准备两个文件一个正常一个行末多了空格或中间多了空行diff -w会认为它们相同。提高篇check.sh内容参考#!/bin/bashgcc greet.c-ogreet ./greetoutput.txtifdiff-qoutput.txt expected.txt/dev/null;thenechoPASSelseechoFAILdiff-uexpected.txt output.txtfi输入输出文件示例1.in内容3 51.out内容152.in内容0 102.out内容0脚本结构与第七节的test.sh类似循环变量相应增加。十一、✅diff命令速查卡选项作用示例无默认输出差异行diff file1 file2-u统一格式最易读diff -u file1 file2-y并排显示diff -y file1 file2-q只报告是否不同不看细节diff -q file1 file2-s相同时打印消息diff -s file1 file2-w忽略空白差异diff -w file1 file2-B忽略空行差异diff -B file1 file2-r递归比较目录diff -r dir1 dir2自动化核心利用退出码0为相同1为不同在 Shell 脚本中判断。十二、学习检查清单diff的基本作用是什么如果两个文件完全相同diff会输出什么如何把程序输出保存到文件需要用到哪个符号diff -u和diff -y的输出分别有什么特点在 Shell 脚本中如何判断diff发现文件不同利用什么变量编写自动化测试脚本的一般步骤是什么编译、运行、重定向输出、比较、报告如果程序输出多了一些无害的空格使用哪个选项可以让diff忽略它们

相关新闻

多模态自主智能体与树搜索:让AI真正‘看懂’并操作网页

多模态自主智能体与树搜索:让AI真正‘看懂’并操作网页

1. 项目概述:当AI开始“看懂”网页并自主决策你有没有过这种体验:在电商网站上比价,翻了五页才找到想要的型号;在政府服务页面里反复点击“下一步”,却总卡在某个没说明白的字段;或者帮长辈填一份医保申请表…

2026/7/19 22:04:46 阅读更多 →
Node.js核心特性与五大应用场景解析

Node.js核心特性与五大应用场景解析

1. Node.js的核心定位与适用场景Node.js本质上是一个基于Chrome V8引擎的JavaScript运行时环境,它让JavaScript突破了浏览器的限制,能够在服务器端运行。这种设计带来了几个关键特性:事件驱动架构:采用单线程事件循环模型&#xf…

2026/7/19 22:04:46 阅读更多 →
嵌入式SDRAM控制器:内存防火墙与旋转引擎的深度解析

嵌入式SDRAM控制器:内存防火墙与旋转引擎的深度解析

1. 项目概述:深入嵌入式系统的“内存交通枢纽” 在智能手机、平板电脑这类我们每天都会接触的嵌入式设备里,处理器(CPU/GPU)和外部内存(SDRAM)之间的数据交换,就像一座繁忙城市的交通。处理器是…

2026/7/19 22:03:45 阅读更多 →

最新新闻

LangGraph 预构建 Agent 实战:create_agent、Supervisor、Swarm 到底封装了什么

LangGraph 预构建 Agent 实战:create_agent、Supervisor、Swarm 到底封装了什么

LangGraph 企业级 Agent 教程 第 6 集。create_agent 三行起一个标准 ReAct 循环,get_graph() 拆开它的真实结构只有两个业务节点,middleware 怎么把限流/审批变成真节点,以及 Supervisor 和 Swarm 的"套娃"本质。 前五集我们全程…

2026/7/20 11:25:30 阅读更多 →
Java中ASCII字符编码与十进制转换实践

Java中ASCII字符编码与十进制转换实践

1. ASCII编码的本质与历史背景ASCII(American Standard Code for Information Interchange)作为计算机领域最基础的字符编码标准,其设计理念深刻影响了现代计算机系统。1963年由美国国家标准学会(ANSI)首次发布&#x…

2026/7/20 11:25:30 阅读更多 →
HoRain云--Codex 斜杆 / 命令

HoRain云--Codex 斜杆 / 命令

🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…

2026/7/20 11:25:30 阅读更多 →
音乐格式转换终极指南:免费解锁各大平台加密音频的完整方案

音乐格式转换终极指南:免费解锁各大平台加密音频的完整方案

音乐格式转换终极指南:免费解锁各大平台加密音频的完整方案 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: …

2026/7/20 11:25:30 阅读更多 →
终极实战指南:如何实现无人机群厘米级定位?基于UWB与IMU融合技术的完整解决方案

终极实战指南:如何实现无人机群厘米级定位?基于UWB与IMU融合技术的完整解决方案

终极实战指南:如何实现无人机群厘米级定位?基于UWB与IMU融合技术的完整解决方案 【免费下载链接】uwb-localization Accurate 3D Localization for MAV Swarms by UWB and IMU Fusion. ICCA 2018 项目地址: https://gitcode.com/gh_mirrors/uw/uwb-loc…

2026/7/20 11:25:30 阅读更多 →
深入解析CPPI 3.0协议与CPDMA配置:从缓冲区描述符到校验和卸载实战

深入解析CPPI 3.0协议与CPDMA配置:从缓冲区描述符到校验和卸载实战

1. 项目概述与核心价值在嵌入式网络应用的开发中,尤其是在处理高速以太网数据流时,CPU如果深陷于数据搬运的泥潭,整个系统的实时性和吞吐量就会大打折扣。这时,DMA(直接内存访问)技术就成了我们的“救星”。…

2026/7/20 11:24:29 阅读更多 →

日新闻

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:00:34 阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:00:34 阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:00:34 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 5:57:49 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 4:31:26 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 5:56:42 阅读更多 →

月新闻