news 2026/7/23 1:26:47

学 Linux_day7 编写第一个Bash脚本,实现一键编译运行第一个C程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
学 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.c

hello.c内容(最简单的 Hello World):

#include<stdio.h>intmain(){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 并运行生成的可执行文件# ============================================SOURCE="hello.c"# 源文件TARGET="hello"# 可执行文件名echo"正在编译$SOURCE..."gcc-g-O0-o"$TARGET""$SOURCE"# 检查编译是否成功($? 是上一条命令的退出码,0 表示成功)if[$?-eq0];thenecho"编译成功!正在运行$TARGET..."echo"=============================="./"$TARGET"elseecho"编译失败,请检查代码。"exit1fi

保存并退出(Ctrl+O,回车,Ctrl+X)。


五、逐行讲解脚本的每一部分

解释
#!/bin/bashShebang,告诉系统用/bin/bash解释器执行本脚本。必须是第一行。
# ...#开头是注释,给人看的,不执行。
SOURCE="hello.c"定义变量SOURCE,值为hello.c。等号两边不能有空格
TARGET="hello"定义变量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 下新建文件默认没有执行权限,需要手动添加:

chmod+x build_run.sh

+x表示添加执行权限。可以用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 <源文件.c>if[$#-eq0];thenecho"用法:$0<源文件.c>"exit1fiSRC="$1"OUT="${SRC%.c}"# 去掉 .c 后缀作为可执行文件名echo"编译$SRC->$OUT..."gcc-g-O0-o"$OUT""$SRC"if[$?-eq0];thenecho"编译成功,运行 ./$OUT..."./"$OUT"elseecho"编译失败"exit1fi

关键点解释

  • $#:传递给脚本的参数个数。
  • $0:脚本自己的名字。
  • $1:第一个参数(例如hello.c)。
  • ${SRC%.c}:字符串处理,去掉末尾的.c。若SRC=hello.c,则OUT=hello

使用示例:

chmod+x build.sh ./build.sh hello.c

这就可以编译任何单个 C 文件,只要它不依赖其他库。


九、更完善的脚本:加入自动化测试

我们还可以把之前学过的diff结合进来,让脚本自动检查输出是否正确。

思路

  1. 编译程序。
  2. 用事先准备好的输入(如果程序需要输入)和预期输出文件。
  3. 运行程序并将输出保存到临时文件。
  4. diff比较实际输出和预期输出。
  5. 显示测试结果。

示例脚本test.sh(假设程序不需要输入,直接比输出):

#!/bin/bashgcc hello.c-ohello ./hello>output.txtifdiff-qexpected.txt output.txt>/dev/null;thenecho"测试通过"elseecho"测试失败"diff-uexpected.txt output.txtfi

为后续学习自动化测试打下基础。


十、练习题(由浅入深)

基础篇

  1. 在当前目录创建greet.c,输出 “Hello, Script!”。然后编写脚本run_greet.sh,一键编译并运行它。
  2. 解释脚本中$?的含义,并修改脚本,使之在编译失败时用红色(可选)打印错误信息(提示:echo -e "\033[31m编译失败\033[0m")。
  3. 不使用chmod +x,能否用其他方式运行脚本?(提示:bash 脚本名

进阶篇

  1. 编写通用编译运行脚本build.sh(如第八节),然后分别用它编译运行hello.cgreet.c
  2. 在脚本中加入版本控制:如果可执行文件已经存在且比源文件新,则跳过编译直接运行(提示:用test命令比较文件时间-nt)。
  3. 尝试在脚本中处理gcc的警告信息,如果编译有警告但成功,打印 “编译成功,但有警告”。

提高篇

  1. 写一个脚本batch_build.sh,它接收多个.c文件作为参数,依次编译运行每一个,遇到编译失败的跳过并报告。
  2. 结合diff,给hello.c写一个自动化测试脚本:程序输出与预期输出比较,通过即打印 PASS,失败打印 FAIL 并显示差异。

十一、答案与解析

基础篇

  1. 创建greet.c,内容类似。脚本只需把SOURCE改为greet.cTARGET改为greet即可。
  2. $?是上一条命令的退出码,0 表示成功,非 0 表示失败。添加颜色可写成echo -e "\033[31m编译失败\033[0m"
  3. 可以用bash build_run.sh直接运行,此时不需要执行权限,因为 bash 读取文件内容执行。

进阶篇

  1. 通用脚本使用参数./build.sh greet.c即可。
  2. 判断if [ -f "$OUT" ] && [ "$OUT" -nt "$SRC" ]; then可跳过编译(-nt表示 “newer than”)。
  3. 可以用gcc ... 2> warnings.txt将标准错误重定向,然后检查文件是否为空。

提高篇

  1. batch_build.sh示例:
    #!/bin/bashforfilein"$@";doif[-f"$file"];thenout="${file%.c}"gcc"$file"-o"$out"if[$?-eq0];thenecho"运行$out..."./"$out"elseecho"编译$file失败"fielseecho"$file不存在"fidone
  2. 参考第九节test.sh

十二、学习检查清单

  • Shebang 的作用是什么?它必须放在第几行?
  • 如何定义变量?引用变量时前面要加什么符号?
  • $?$#$1$0分别代表什么?
  • 怎样给脚本添加执行权限?
  • 脚本里如何用if判断命令是否成功?
  • ${变量%.c}的含义是什么?
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 1:25:39

2026最新5款Claude Code高性价比平替实测对比

我是一名全栈独立开发者&#xff0c;平时接一些外包项目来做&#xff0c;每个月都要在AI编程工具上花不少订阅费。最近 Claude Code 按用量计费的模式让我账单越来越高&#xff0c;随便用用一个月就要一两百美元&#xff0c;对于独立开发者来说实在吃不消。我开始寻找合适的平替…

作者头像 李华
网站建设 2026/7/23 1:22:15

架构思维在人生规划中的应用与实践

1. 从技术架构到人生架构的思维跃迁第一次听到"人生架构"这个概念是在2015年北欧的一次技术峰会上。当时Tieto&#xff08;叠拓&#xff09;的一位首席架构师在演讲结尾突然话锋一转&#xff1a;"我们整天讨论系统架构&#xff0c;但有没有想过自己的人生也需要…

作者头像 李华
网站建设 2026/7/23 1:20:27

HarmonyOS ArkTS 实战:实现一个校园证件照拍摄与预约应用

HarmonyOS ArkTS 实战:实现一个校园证件照拍摄与预约应用 项目效果 本文使用 HarmonyOS 和 ArkTS 实现一个校园证件照拍摄与预约应用。 应用可以预约证件照拍摄,选择证件照尺寸,在线选片,查看拍摄样片,并提供拍摄预约、照片下载、打印配送等功能。 项目使用 DevEco Studio…

作者头像 李华
网站建设 2026/7/23 1:18:40

AI论文写作工具:从开题到文献综述的高效解决方案

1. 论文写作痛点与AI工具的崛起写论文最痛苦的时刻莫过于开题阶段——盯着空白文档发呆&#xff0c;脑子里有千万个想法却不知从何下笔。我指导过上百名学生的论文写作&#xff0c;发现80%的拖延症都始于开题卡壳。直到去年偶然试用了几款AI写作工具&#xff0c;才意识到这个领…

作者头像 李华
网站建设 2026/7/23 1:12:57

扎耶德可持续发展奖的Beyond2020计划为印度超过20万人增强医疗系统韧性

六座太阳能供电医疗设施持续改善印度卡纳塔克邦农村地区的可靠医疗服务 作为阿联酋为应对全球挑战的创新解决方案设立的开创性奖项&#xff0c;扎耶德可持续发展奖(Zayed Sustainability Prize)发起的旗舰倡议Beyond2020今日宣布&#xff0c;已在印度部署多座太阳能供电的医疗中…

作者头像 李华
网站建设 2026/7/23 1:08:53

2026 AI炒股与智能投顾工具架构选型:多阵营工程化对比

作者&#xff1a;AI 金融行业观察员&#xff0c;专注 2025-2026 智能投顾、AI 理财工具赛道跟踪&#xff1b;内容基于券商公开产品文档、第三方行业测评、公开市场资讯整理&#xff0c;数据均可溯源。 本文仅对财搭子、AI涨乐、同花顺、通达信做客观功能对比&#xff0c;所有 …

作者头像 李华