学 Linux_day7 编写第一个Bash脚本,实现一键编译运行第一个C程序
第一个 Bash 脚本一键编译运行 Hello World一、我们之前怎么做之前写好了hello.c后操作过程是gcc hello.c-ohello ./hello每次修改代码后都要重复敲这两条命令。现在我们把它写进一个脚本以后只要一条命令就能自动完成编译 运行。二、什么是 Bash 脚本Bash 脚本就是一个纯文本文件里面按顺序写着终端命令。运行这个脚本就相当于把你手动敲的命令自动执行一遍。类比你手动编译运行自己一步步操作Bash 脚本把步骤写成“剧本”由计算机自动表演优点避免重复输入提高效率可以加入判断、循环让操作更智能方便分享给他人保证操作一致性三、准备工作确认你的第一个 C 程序我们在家目录下新建一个工作目录并把之前的hello.c放进去如果还没有现在就创建一个mkdir-p~/my_first_scriptcd~/my_first_scriptnanohello.chello.c内容最简单的 Hello World#includestdio.hintmain(){printf(Hello, Linux!\n);return0;}保存退出。我们先手动编译运行一次确保一切正常gcc hello.c-ohello ./hello看到Hello, Linux!输出说明程序没问题。四、编写第一个脚本build_run.sh用编辑器创建脚本文件nanobuild_run.sh输入以下内容#!/bin/bash# # 脚本: build_run.sh# 功能: 一键编译 hello.c 并运行生成的可执行文件# SOURCEhello.c# 源文件TARGEThello# 可执行文件名echo正在编译$SOURCE...gcc-g-O0-o$TARGET$SOURCE# 检查编译是否成功$? 是上一条命令的退出码0 表示成功if[$?-eq0];thenecho编译成功正在运行$TARGET...echo./$TARGETelseecho编译失败请检查代码。exit1fi保存并退出CtrlO回车CtrlX。五、逐行讲解脚本的每一部分行解释#!/bin/bashShebang告诉系统用/bin/bash解释器执行本脚本。必须是第一行。# ...以#开头是注释给人看的不执行。SOURCEhello.c定义变量SOURCE值为hello.c。等号两边不能有空格。TARGEThello定义变量TARGET值为可执行文件名。echo 正在编译 $SOURCE ...echo打印信息。$SOURCE会被替换成hello.c。gcc -g -O0 -o $TARGET $SOURCE编译命令-g包含调试信息-O0不优化。变量用双引号括起来防止意外。if [ $? -eq 0 ]; then$?是上一条命令的退出码。-eq 0判断是否等于 0。整句意思是“如果编译成功那么…”echo 编译成功...提示编译成功。echo 装饰性分隔线。./$TARGET运行可执行文件。else否则编译失败执行下面部分。echo 编译失败...提示失败。exit 1脚本以非 0 状态退出表示异常终止。六、赋予脚本执行权限Linux 下新建文件默认没有执行权限需要手动添加chmodx build_run.shx表示添加执行权限。可以用ls -l检查应该看到类似-rwxr-xr-x的权限。七、运行脚本直接在当前目录执行./build_run.sh你会看到正在编译 hello.c ... 编译成功正在运行 hello ... Hello, Linux!完美以后修改hello.c后只需再运行一次./build_run.sh即可无需手动敲两条命令。八、让脚本更通用支持任意.c文件目前的脚本写死了文件名。我们可以改进一下让它能从命令行接收源文件名。创建build.sh通用版#!/bin/bash# 通用编译运行脚本# 用法: ./build.sh 源文件.cif[$#-eq0];thenecho用法:$0源文件.cexit1fiSRC$1OUT${SRC%.c}# 去掉 .c 后缀作为可执行文件名echo编译$SRC-$OUT...gcc-g-O0-o$OUT$SRCif[$?-eq0];thenecho编译成功运行 ./$OUT..../$OUTelseecho编译失败exit1fi关键点解释$#传递给脚本的参数个数。$0脚本自己的名字。$1第一个参数例如hello.c。${SRC%.c}字符串处理去掉末尾的.c。若SRChello.c则OUThello。使用示例chmodx build.sh ./build.sh hello.c这就可以编译任何单个 C 文件只要它不依赖其他库。九、更完善的脚本加入自动化测试我们还可以把之前学过的diff结合进来让脚本自动检查输出是否正确。思路编译程序。用事先准备好的输入如果程序需要输入和预期输出文件。运行程序并将输出保存到临时文件。用diff比较实际输出和预期输出。显示测试结果。示例脚本test.sh假设程序不需要输入直接比输出#!/bin/bashgcc hello.c-ohello ./hellooutput.txtifdiff-qexpected.txt output.txt/dev/null;thenecho测试通过elseecho测试失败diff-uexpected.txt output.txtfi为后续学习自动化测试打下基础。十、练习题由浅入深基础篇在当前目录创建greet.c输出 “Hello, Script!”。然后编写脚本run_greet.sh一键编译并运行它。解释脚本中$?的含义并修改脚本使之在编译失败时用红色可选打印错误信息提示echo -e \033[31m编译失败\033[0m。不使用chmod x能否用其他方式运行脚本提示bash 脚本名进阶篇编写通用编译运行脚本build.sh如第八节然后分别用它编译运行hello.c和greet.c。在脚本中加入版本控制如果可执行文件已经存在且比源文件新则跳过编译直接运行提示用test命令比较文件时间-nt。尝试在脚本中处理gcc的警告信息如果编译有警告但成功打印 “编译成功但有警告”。提高篇写一个脚本batch_build.sh它接收多个.c文件作为参数依次编译运行每一个遇到编译失败的跳过并报告。结合diff给hello.c写一个自动化测试脚本程序输出与预期输出比较通过即打印 PASS失败打印 FAIL 并显示差异。十一、答案与解析基础篇创建greet.c内容类似。脚本只需把SOURCE改为greet.cTARGET改为greet即可。$?是上一条命令的退出码0 表示成功非 0 表示失败。添加颜色可写成echo -e \033[31m编译失败\033[0m。可以用bash build_run.sh直接运行此时不需要执行权限因为 bash 读取文件内容执行。进阶篇通用脚本使用参数./build.sh greet.c即可。判断if [ -f $OUT ] [ $OUT -nt $SRC ]; then可跳过编译-nt表示 “newer than”。可以用gcc ... 2 warnings.txt将标准错误重定向然后检查文件是否为空。提高篇batch_build.sh示例#!/bin/bashforfilein$;doif[-f$file];thenout${file%.c}gcc$file-o$outif[$?-eq0];thenecho运行$out..../$outelseecho编译$file失败fielseecho$file不存在fidone参考第九节test.sh。十二、学习检查清单Shebang 的作用是什么它必须放在第几行如何定义变量引用变量时前面要加什么符号$?、$#、$1、$0分别代表什么怎样给脚本添加执行权限脚本里如何用if判断命令是否成功${变量%.c}的含义是什么

相关新闻

Unity角色动画插件开发:从美术资源到可复用组件的工程化实践

Unity角色动画插件开发:从美术资源到可复用组件的工程化实践

1. 项目概述:从零到一,打造一个可复用的哥布林动画插件在游戏开发中,怪物角色的制作往往是美术资源消耗和程序逻辑实现的重灾区。尤其是像哥布林这种经典的反派角色,它需要一套完整的模型、骨骼、材质,以及从待机、移动…

2026/7/23 1:26:51 阅读更多 →
Web3.0入门指南:区块链、智能合约与加密货币实践

Web3.0入门指南:区块链、智能合约与加密货币实践

1. Web3.0入门指南:从零开始参与下一代互联网Web3.0正在重塑我们与数字世界的互动方式。作为一个长期关注去中心化技术的从业者,我见证了从比特币白皮书到如今百花齐放的Web3生态的完整演进历程。与Web2.0时代由科技巨头主导的集中式服务不同&#xff0c…

2026/7/23 1:25:51 阅读更多 →
如果关注瑞德克斯安全核验,是否清楚?

如果关注瑞德克斯安全核验,是否清楚?

看瑞德克斯时,很多人会先关心账户安全、资料步骤和规则边界是否讲得细。从资料流程角度观察,平台服务把复杂事项拆解得更容易理解,普通用户自然更容易形成稳定印象。这些细节拼在一起,才构成瑞德克斯比较自然、也比较稳健的整体印…

2026/7/23 1:25:51 阅读更多 →

最新新闻

Google Frozen v2:Gemini大模型硬件固化实现6-10倍AI推理能效提升

Google Frozen v2:Gemini大模型硬件固化实现6-10倍AI推理能效提升

在AI芯片设计领域,Google近期曝光的内部项目"Frozen v2"引起了广泛关注。这一创新技术将Gemini大模型的核心架构直接固化到专用硬件中,据称能实现6-10倍的效率提升。对于从事AI加速器开发、边缘计算部署和大型语言模型优化的工程师来说&#x…

2026/7/23 2:06:05 阅读更多 →
PS画笔工具无响应?5步排查与解决方案

PS画笔工具无响应?5步排查与解决方案

1. 问题现象与初步排查最近在修图时突然发现PS的画笔工具罢工了——点击画布没反应,切换笔刷也没用,但其他工具都正常。这种局部功能失效的情况往往比软件完全崩溃更让人头疼,毕竟重装PS动辄几个G的安装包,能修好当然首选修复。经…

2026/7/23 2:06:05 阅读更多 →
UE4免费获取高质量3D资产:Quixel Bridge与Megascans实战指南

UE4免费获取高质量3D资产:Quixel Bridge与Megascans实战指南

1. 项目概述:为什么你需要关注Quixel Bridge与Megascans如果你正在用UE4做项目,无论是个人练习还是商业开发,大概率都经历过“找资源”的痛苦。网上搜来的模型,要么面数太高没法用,要么贴图质量参差不齐,好…

2026/7/23 2:06:05 阅读更多 →
Day07_C语言字符串避坑指南

Day07_C语言字符串避坑指南

嵌入式自学 Day07:我踩过的 6 个字符串坑——strlen、sizeof、\0、gets 全讲透 这是我的嵌入式自学 Day07。 前几天一直在学数组,我以为字符数组不过是「存字符的数组」。 直到写出这样一段代码: char s[10] "hello";printf(&…

2026/7/23 2:06:05 阅读更多 →
MySQL 索引原理——B+ 树、聚簇索引、覆盖索引

MySQL 索引原理——B+ 树、聚簇索引、覆盖索引

索引是 MySQL 性能优化的核心。理解索引的原理,才能用好索引。 一、B 树结构 叶子节点存数据,非叶子节点存键值指针 叶子节点之间有链表连接,支持范围查询 高度 3-4 层能支撑千万级数据二、聚簇 vs 非聚簇 InnoDB 主键索引(聚簇&a…

2026/7/23 2:06:05 阅读更多 →
CDN行业爆雷解析与高可用架构设计指南

CDN行业爆雷解析与高可用架构设计指南

1. CDN行业现状与爆雷事件解析最近两年CDN行业频繁出现服务商突然倒闭、跑路的事件,让不少网站运营者和开发者措手不及。作为从业十年的老站长,我亲眼见证过至少5家中小型CDN服务商的突然倒闭,每次都会引发一波网站瘫痪潮。这些爆雷事件通常有…

2026/7/23 2:05:05 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

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

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

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

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/22 12:54:44 阅读更多 →

月新闻