学 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/10/1 18:27:50 阅读更多 →
Web3.0入门指南:区块链、智能合约与加密货币实践

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

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

2026/9/29 6:57:03 阅读更多 →
如果关注瑞德克斯安全核验,是否清楚?

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

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

2026/10/11 13:18:09 阅读更多 →

最新新闻

3.9GB 里藏了什么:Bonsai 的混合注意力 + 推测解码 + 262K 上下文,端侧架构逐层拆

3.9GB 里藏了什么:Bonsai 的混合注意力 + 推测解码 + 262K 上下文,端侧架构逐层拆

3.9GB 里藏了什么:Bonsai 的混合注意力 推测解码 262K 上下文,端侧架构逐层拆 【免费下载链接】Ternary-Bonsai-2-27B-mlx-2bit 项目地址: https://ai.gitcode.com/hf_mirrors/prism-ml/Ternary-Bonsai-2-27B-mlx-2bit 当"27B 参数大模型…

2026/10/11 21:24:17 阅读更多 →
多特征LSTM电力负荷预测:从数据处理到模型部署的完整实践

多特征LSTM电力负荷预测:从数据处理到模型部署的完整实践

简介:面向计算机相关专业学生、教师及企业员工的电力负荷预测程序源码包,基于深度学习长短期记忆网络实现多特征电力负荷预测,可满足课程设计、毕业设计及项目初期立项演示等需求。包内共8个文件,包含Python脚本(数据预…

2026/10/11 21:24:17 阅读更多 →
MySQL死锁全解析:从1213报错到排查复现与预防实战

MySQL死锁全解析:从1213报错到排查复现与预防实战

先说个真实感受。只要你线上跑着 MySQL,迟早会遇到下面这条错误:ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction第一次看到这条报错,大部分人是懵的。数据库只是一个存储系统,为什么更…

2026/10/11 21:24:17 阅读更多 →
MySQL DML与DQL底层逻辑:语法、执行顺序与索引优化实战

MySQL DML与DQL底层逻辑:语法、执行顺序与索引优化实战

带新人的时候我经常发现一个有意思的现象:很多人写了两三年SQL,增删改查看起来都熟,但一问到DML和DQL的底层逻辑、执行顺序、索引匹配规则,就开始支支吾吾。写是能写,遇到数据量上来、查询变慢、误操作删错数据&#x…

2026/10/11 21:24:17 阅读更多 →
把 Cursor Base URL 改到 TaoToken 后,我转 Codex 大半个月的真实体验

把 Cursor Base URL 改到 TaoToken 后,我转 Codex 大半个月的真实体验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 21:24:17 阅读更多 →
Claude Code Subagent状态实时监控:基于tmux自定义状态栏

Claude Code Subagent状态实时监控:基于tmux自定义状态栏

Claude Code 用久了,你迟早会遇到一个场景:主任务里并行派出三四个 Subagent,各自读仓库、写测试、跑静态检查,终端只显示主对话流,根本看不出每个子代理到底在跑还是在挂。为了看清楚这些状态,我折腾了一个…

2026/10/11 21:23:16 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →