第2章:进阶Linux系统——第10节:Linux 系统编程与 Shell 脚本全解笔记(GCC+Make+Vim+Shell Script)

目录

一、文档核心总览

二、程序调试基础(核心概念)

[2.1 调试定义](#2.1 调试定义)

[2.2 程序三大错误类型](#2.2 程序三大错误类型)

(1)编译时错误

(2)运行时错误

[(3)逻辑错误 & 语义错误](#(3)逻辑错误 & 语义错误)

[三、GCC 编译器使用(Linux 标准编译器)](#三、GCC 编译器使用(Linux 标准编译器))

[3.1 GCC 基础认知](#3.1 GCC 基础认知)

[3.2 GCC 安装(CentOS/RHEL 7)](#3.2 GCC 安装(CentOS/RHEL 7))

(1)检查是否安装

[(2)yum 安装 GCC](#(2)yum 安装 GCC)

[3.3 GCC 核心编译命令](#3.3 GCC 核心编译命令)

[(1)基础编译(默认生成 a.out)](#(1)基础编译(默认生成 a.out))

(2)分步编译(生成目标文件.o)

[(3)多文件编译(主程序 + 子程序)](#(3)多文件编译(主程序 + 子程序))

[(4)链接外部函数库(以数学库 libm 为例)](#(4)链接外部函数库(以数学库 libm 为例))

[(5)GCC 常用参数汇总](#(5)GCC 常用参数汇总)

[四、Make 与 Makefile(自动化编译工具)](#四、Make 与 Makefile(自动化编译工具))

[4.1 为什么用 Make](#4.1 为什么用 Make)

[4.2 Makefile 基本语法](#4.2 Makefile 基本语法)

(1)核心规则

[(2)基础 Makefile 示例](#(2)基础 Makefile 示例)

[(3)Makefile 变量简化](#(3)Makefile 变量简化)

[4.3 Make 常用命令](#4.3 Make 常用命令)

[4.4 Makefile 变量优先级](#4.4 Makefile 变量优先级)

[五、Vim 编辑器(Linux 必备文本工具)](#五、Vim 编辑器(Linux 必备文本工具))

[5.1 Vim 三大工作模式](#5.1 Vim 三大工作模式)

(1)编辑模式(命令模式)

(2)插入模式

(3)命令模式(末行模式)

[5.2 Vim 高频操作速查](#5.2 Vim 高频操作速查)

[六、Shell 环境与基础操作](#六、Shell 环境与基础操作)

[6.1 Shell 核心概念](#6.1 Shell 核心概念)

[6.2 Shell 变量](#6.2 Shell 变量)

(1)变量定义与引用

(2)变量作用域

(3)常用环境变量

[6.3 多重命令执行(&&、||、;)](#6.3 多重命令执行(&&、||、;))

[6.4 输入输出重定向](#6.4 输入输出重定向)

[6.5 管道命令|](#6.5 管道命令|)

七、正则表达式(文本处理神器)

[7.1 基础正则字符](#7.1 基础正则字符)

[7.2 grep 配合正则使用](#7.2 grep 配合正则使用)

[八、Shell Script 编程(自动化脚本)](#八、Shell Script 编程(自动化脚本))

[8.1 脚本基础](#8.1 脚本基础)

(1)脚本结构

(2)脚本执行方式

[8.2 脚本核心功能](#8.2 脚本核心功能)

[(1)用户输入(read 命令)](#(1)用户输入(read 命令))

(2)数值运算

(3)日期处理

[8.3 条件判断](#8.3 条件判断)

[(1)test 命令判断](#(1)test 命令判断)

(2)中括号[]判断(常用)

[(3)if 条件语句](#(3)if 条件语句)

[(4)case 条件语句(多固定值匹配)](#(4)case 条件语句(多固定值匹配))

[8.4 循环语句](#8.4 循环语句)

[(1)while 循环(条件成立则循环)](#(1)while 循环(条件成立则循环))

[(2)for 循环(固定次数 / 遍历)](#(2)for 循环(固定次数 / 遍历))

[8.5 函数(function)](#8.5 函数(function))

[8.6 脚本调试](#8.6 脚本调试)

九、扩展知识(进阶补充)

[9.1 GCC 调试扩展(gdb 工具)](#9.1 GCC 调试扩展(gdb 工具))

[9.2 Makefile 高级特性](#9.2 Makefile 高级特性)

[9.3 Shell 脚本高级应用](#9.3 Shell 脚本高级应用)

[9.4 Vim 高级配置](#9.4 Vim 高级配置)

[9.5 正则扩展(扩展正则)](#9.5 正则扩展(扩展正则))

十、核心知识点总结




一、文档核心总览

本笔记基于RHEL 7.4/CentOS 7.4系统,整合程序调试、GCC 编译、Make 工具、Vim 编辑器、Shell 环境、正则表达式、Shell 脚本编程全流程知识,覆盖 Linux 下程序开发与系统自动化管理核心技能,适合零基础入门与实战应用。




二、程序调试基础(核心概念)

2.1 调试定义

  • Bug:程序中的错误,源于早期计算机因臭虫导致故障的典故。
  • Debug:查找并修复程序错误的过程,是程序员核心技能。

2.2 程序三大错误类型

(1)编译时错误

  • 编译器无法识别语法,直接编译失败,不生成可执行文件。
  • 常见原因:拼写错误、符号缺失、语法不规范。
  • 特点:编译器会提示错误行,新手易犯,经验丰富后可快速定位。

(2)运行时错误

  • 编译通过、生成可执行文件,但运行时崩溃。
  • 常见原因:数组越界、除零错误、内存溢出、函数未定义。
  • 特点:编译器无法检测,需运行时排查。

(3)逻辑错误 & 语义错误

  • 编译、运行均无报错,但程序执行结果不符合预期。
  • 本质:代码逻辑与设计意图不符。
  • 排查方法:通过输出结果反向推导代码执行流程。



三、GCC 编译器使用(Linux 标准编译器)

3.1 GCC 基础认知

  • 全称:GNU Compiler Collection(GNU 编译器集合)。
  • 支持语言:C、C++、Fortran、Java、Objective-C 等。
  • 地位:Linux / 类 UNIX 系统标准编译器,开源免费。

3.2 GCC 安装(CentOS/RHEL 7)

(1)检查是否安装

复制代码
rpm -qa | grep gcc

(2)yum 安装 GCC

复制代码
# 挂载光盘镜像
mount /dev/cdrom /iso
# 配置yum源
vim /etc/yum.repos.d/dvd.repo
# 写入内容
[dvd]
name=dvd
baseurl=file:///iso
gpgcheck=0
enabled=1
# 清除缓存并安装
yum clean all
yum install gcc gcc-c++ -y

3.3 GCC 核心编译命令

(1)基础编译(默认生成 a.out)

复制代码
gcc hello.c  # 直接编译,生成a.out可执行文件
./a.out      # 运行程序

(2)分步编译(生成目标文件.o)

复制代码
gcc -c hello.c  # 仅编译,不链接,生成hello.o目标文件
gcc -o hello hello.o  # 将.o文件链接为指定名称的可执行文件
./hello  # 运行

(3)多文件编译(主程序 + 子程序)

复制代码
# 编译多个源文件为.o
gcc -c thanks.c thanks_2.c
# 链接为可执行文件
gcc -o thanks thanks.o thanks_2.o
./thanks

(4)链接外部函数库(以数学库 libm 为例)

  • 错误场景:使用sin/cos函数直接编译报错undefined reference to sin

  • 原因:数学函数位于libm.so库,需手动链接。

  • 正确命令:

    gcc sin.c -lm -L/usr/lib -I/usr/include

  • 参数解释:

    • -l:链接指定函数库(-lm = 链接libm.so)。
    • -L:指定函数库搜索路径(默认/lib//usr/lib)。
    • -I:指定头文件搜索路径(默认/usr/include)。

(5)GCC 常用参数汇总

参数 作用
-c 仅编译生成.o 目标文件,不链接
-o 文件名 指定输出可执行文件名称
-Wall 显示所有警告信息,严谨编译
-O 编译优化,提升程序运行速度
-g 生成调试信息,供 gdb 调试使用



四、Make 与 Makefile(自动化编译工具)

4.1 为什么用 Make

  • 场景:多文件项目编译命令繁琐,修改单个文件需重新编译所有文件。
  • 优势:
    1. 一键执行编译流程,简化命令。
    2. 自动检测文件修改,仅编译更新的文件,提升效率。
    3. 统一编译规则,便于项目管理。

4.2 Makefile 基本语法

(1)核心规则

复制代码
目标(target): 依赖文件
<Tab> 编译命令  # 必须以Tab开头,不能用空格!
  • 目标:要生成的文件(如可执行文件 main)。
  • 依赖文件:生成目标所需的.o 文件 / 源文件。
  • 命令:执行的编译指令,必须以 Tab 键开头

(2)基础 Makefile 示例

复制代码
main: main.o haha.o sin_value.o cos_value.o
	gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
	rm -f main *.o

(3)Makefile 变量简化

复制代码
# 定义变量
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall  # 编译参数
# 规则
main: ${OBJS}
	gcc -o $@ ${OBJS} ${LIBS}  # $@代表当前目标(main)
clean:
	rm -f main ${OBJS}

4.3 Make 常用命令

复制代码
make          # 执行第一个目标(默认编译)
make clean    # 执行clean目标,清理编译文件
make main     # 仅编译生成main

4.4 Makefile 变量优先级

  1. 命令行指定变量(最高):CFLAGS="-Wall" make clean main
  2. Makefile 内定义变量
  3. Shell 环境变量(最低)



五、Vim 编辑器(Linux 必备文本工具)

5.1 Vim 三大工作模式

(1)编辑模式(命令模式)

  • 启动 Vim 默认进入,用于执行光标移动、复制、删除、查找。
  • 核心操作:
    • 光标移动:h 左、j 下、k 上、l 右;G 尾行、gg 首行、nG 跳转到第 n 行。
    • 删除:dd 删整行、x 删单个字符、ndd 删 n 行。
    • 复制粘贴:yy 复制、p 粘贴、nyy 复制 n 行。
    • 撤销 / 重做:u 撤销、Ctrl+r 重做。

(2)插入模式

  • 用于输入文本,从编辑模式进入:
    • i:光标前插入
    • a:光标后插入
    • o:光标下一行新开行插入
    • Esc:退回编辑模式。

(3)命令模式(末行模式)

  • 编辑模式按:进入,用于保存、退出、查找替换。
  • 核心命令:
    • :w 保存、:q 退出、:wq 保存退出、:q! 不保存强制退出。
    • :set nu 显示行号、:set nonu 隐藏行号。
    • :n1,n2 s/旧字符/新字符/gc 批量替换(c = 确认)。

5.2 Vim 高频操作速查

  1. 查找:/关键词 向下查找,n 下一个、N 上一个。
  2. 快速跳转:0 行首、$ 行尾、Ctrl+f 下一页、Ctrl+b 上一页。
  3. 另存为::w 新文件名



六、Shell 环境与基础操作

6.1 Shell 核心概念

  • 定义:用户与 Linux 内核的接口,负责解释执行命令。
  • 主流版本:Bash(CentOS/RHEL 默认)、C Shell、Korn Shell。

6.2 Shell 变量

(1)变量定义与引用

复制代码
name="Linux"  # 定义变量
echo $name    # 引用变量
  • 规则:变量名以字母 / 下划线开头,等号两侧无空格。

(2)变量作用域

  • 局部变量:仅当前 Shell 有效。

  • 全局变量:当前 Shell + 子 Shell 有效,用export声明。

    var2="unix"
    export var2 # 转为全局变量

(3)常用环境变量

变量 作用
PATH 命令搜索路径
HOME 当前用户家目录
PWD 当前工作目录
PS1 命令行提示符

6.3 多重命令执行(&&、||、;)

  • cmd1; cmd2:顺序执行,不判断结果。

  • cmd1 && cmd2:cmd1 执行成功,才执行 cmd2。

  • cmd1 || cmd2:cmd1 执行失败,才执行 cmd2。

    ls /tmp && echo "目录存在" # 存在则提示
    ls /tmp || mkdir /tmp # 不存在则创建

6.4 输入输出重定向

符号 作用
> 输出重定向(覆盖)
>> 输出重定向(追加)
< 输入重定向
2> 错误重定向
&> 输出 + 错误重定向
复制代码
ls /tmp > file.txt  # 结果写入文件
ls /null 2> /dev/null  # 错误信息丢入空设备

6.5 管道命令|

  • 作用:将前一个命令的输出,作为后一个命令的输入。

    who | wc -l # 统计登录用户数
    dmesg | grep IPv6 # 筛选内核信息




七、正则表达式(文本处理神器)

7.1 基础正则字符

字符 含义
^word 以 word 开头
word$ 以 word 结尾
. 任意一个字符
* 重复前一个字符 0~ 无数次
[] 匹配括号内任意一个字符
[^] 反向匹配,不包含括号内字符
\{n,m\} 重复前一个字符 n~m 次

7.2 grep 配合正则使用

复制代码
grep -n '^the' sample.txt  # 查找以the开头的行
grep -n '[0-9]' sample.txt # 查找包含数字的行
grep -n 'go\{2,5\}g' sample.txt  # 匹配google类字符串



八、Shell Script 编程(自动化脚本)

8.1 脚本基础

(1)脚本结构

复制代码
#!/bin/bash  # 声明解释器(必须第一行)
# 注释:功能、作者、版本、历史
PATH=/bin:/sbin:/usr/bin:/usr/sbin:~/bin
export PATH  # 声明环境变量
# 执行代码
echo "Hello World"
exit 0  # 退出脚本,返回值0=成功

(2)脚本执行方式

  1. 赋予权限直接执行:chmod +x script.sh && ./script.sh
  2. 用 bash 执行:bash script.sh(无需执行权限)
  3. 父进程执行:source script.sh(变量会留在当前 Shell)

8.2 脚本核心功能

(1)用户输入(read 命令)

复制代码
read -p "请输入姓名:" name
echo "你好:$name"

(2)数值运算

复制代码
total=$((1+2*3))  # 整数运算
echo $total

(3)日期处理

复制代码
date +%Y%m%d  # 输出年月日
date --date='2 days ago' +%Y%m%d  # 前两天日期

8.3 条件判断

(1)test 命令判断

复制代码
test -e /tmp && echo "存在"  # 判断文件/目录是否存在
test -f file && echo "是普通文件"
test -d dir && echo "是目录"

(2)中括号[]判断(常用)

  • 规则:括号两端必须有空格,变量用双引号包裹。

    [ "name" == "Linux" ] && echo "匹配成功" [ num -gt 10 ] && echo "大于10" # -gt=大于

(3)if 条件语句

复制代码
# 单分支
if [ "$yn" == "Y" ]; then
	echo "继续"
fi

# 多分支
if [ "$yn" == "Y" ]; then
	echo "继续"
elif [ "$yn" == "N" ]; then
	echo "中断"
else
	echo "输入错误"
fi

(4)case 条件语句(多固定值匹配)

复制代码
case $1 in
"hello")
	echo "你好"
	;;
"")
	echo "请输入参数"
	;;
*)
	echo "用法:$0 hello"
	;;
esac

8.4 循环语句

(1)while 循环(条件成立则循环)

复制代码
i=1
s=0
while [ $i -le 100 ]
do
	s=$((s+i))
	i=$((i+1))
done
echo "1+2+...+100=$s"

(2)for 循环(固定次数 / 遍历)

复制代码
# 遍历列表
for animal in dog cat elephant
do
	echo $animal
done

# 数值循环
for ((i=1;i<=10;i++))
do
	echo $i
done

8.5 函数(function)

复制代码
function printit(){
	echo "你的选择:$1"
}
printit 1  # 调用函数,传参1

8.6 脚本调试

复制代码
sh -n script.sh  # 仅检查语法,不执行
sh -x script.sh  # 显示执行过程,排查错误
sh -v script.sh  # 显示脚本内容后执行



九、扩展知识(进阶补充)

9.1 GCC 调试扩展(gdb 工具)

  • 编译时加-g生成调试信息:gcc -g hello.c -o hello
  • 启动 gdb:gdb hello
  • 核心命令:run运行、break 行号设置断点、next单步执行、quit退出。

9.2 Makefile 高级特性

  1. 自动变量:$^所有依赖文件、$<第一个依赖文件。
  2. 伪目标:.PHONY: clean 避免与同名文件冲突。
  3. 嵌套 Makefile:大型项目分目录管理编译规则。

9.3 Shell 脚本高级应用

  1. 网络服务检测:用netstat+grep检测端口是否开启。
  2. 系统备份:结合tar+date自动按日期备份文件。
  3. 批量用户管理:循环读取账号列表,创建 / 删除用户。

9.4 Vim 高级配置

  • 永久显示行号:echo "set nu" >> ~/.vimrc
  • 语法高亮、自动缩进:Vim 默认支持,适合编程。

9.5 正则扩展(扩展正则)

  • +:重复前一个字符 1 次以上。
  • ?:重复前一个字符 0 或 1 次。
  • ():分组匹配。
  • 使用:grep -Eegrep 支持扩展正则。



十、核心知识点总结

  1. 程序错误:编译时、运行时、逻辑错误,排查优先级依次降低。
  2. GCC :Linux 标准编译器,掌握-c/-o/-lm/-Wall核心参数。
  3. Make :自动化编译,Makefile 核心是目标 + 依赖 + Tab 命令
  4. Vim:三大模式切换,编辑 / 插入 / 命令模式高频操作必记。
  5. Shell:变量、重定向、管道、正则是文本处理核心。
  6. Shell 脚本 :条件判断、循环、函数是自动化编程基础,-x调试必备。
相关推荐
s9123601012 小时前
【docker】Ubuntu22使用skopeo离线推送镜像
运维·docker·容器
ZhiqianXia2 小时前
Pytorch 学习笔记(9): PyTorch.Compile
pytorch·笔记·学习
CHANG_THE_WORLD2 小时前
PDF结构的清晰图示
java·服务器·pdf
孙同学_2 小时前
【Linux篇】应用层协议HTTP
linux·运维·http
Xudde.2 小时前
班级作业笔记报告0x09
笔记·学习·安全·web安全·php
DeadPool loves Star2 小时前
新版VSCode登录Old Linux
linux·ide·vscode
我爱学习好爱好爱2 小时前
Ansible Loop循环 循环遍历的属性 Notify和Handlers
linux·运维·ansible
@insist1232 小时前
网络工程师-因特网与网络互联(二):ARP 与 ICMP,网络层排错双雄
服务器·网络·网络协议·网络工程师·软考·软件水平考试
charlie1145141912 小时前
嵌入式Linux驱动开发——模块参数与内核调试:让模块“活“起来的魔法
linux·驱动开发·学习·c