目录
[2.1 调试定义](#2.1 调试定义)
[2.2 程序三大错误类型](#2.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))
[(2)yum 安装 GCC](#(2)yum 安装 GCC)
[3.3 GCC 核心编译命令](#3.3 GCC 核心编译命令)
[(1)基础编译(默认生成 a.out)](#(1)基础编译(默认生成 a.out))
[(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 基本语法)
[(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 三大工作模式)
[5.2 Vim 高频操作速查](#5.2 Vim 高频操作速查)
[六、Shell 环境与基础操作](#六、Shell 环境与基础操作)
[6.1 Shell 核心概念](#6.1 Shell 核心概念)
[6.2 Shell 变量](#6.2 Shell 变量)
[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 脚本基础)
[8.2 脚本核心功能](#8.2 脚本核心功能)
[(1)用户输入(read 命令)](#(1)用户输入(read 命令))
[8.3 条件判断](#8.3 条件判断)
[(1)test 命令判断](#(1)test 命令判断)
[(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
- 场景:多文件项目编译命令繁琐,修改单个文件需重新编译所有文件。
- 优势:
- 一键执行编译流程,简化命令。
- 自动检测文件修改,仅编译更新的文件,提升效率。
- 统一编译规则,便于项目管理。
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 变量优先级
- 命令行指定变量(最高):
CFLAGS="-Wall" make clean main - Makefile 内定义变量
- 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 高频操作速查
- 查找:
/关键词向下查找,n下一个、N上一个。 - 快速跳转:
0行首、$行尾、Ctrl+f下一页、Ctrl+b上一页。 - 另存为:
: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)脚本执行方式
- 赋予权限直接执行:
chmod +x script.sh && ./script.sh - 用 bash 执行:
bash script.sh(无需执行权限) - 父进程执行:
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 高级特性
- 自动变量:
$^所有依赖文件、$<第一个依赖文件。 - 伪目标:
.PHONY: clean避免与同名文件冲突。 - 嵌套 Makefile:大型项目分目录管理编译规则。
9.3 Shell 脚本高级应用
- 网络服务检测:用
netstat+grep检测端口是否开启。 - 系统备份:结合
tar+date自动按日期备份文件。 - 批量用户管理:循环读取账号列表,创建 / 删除用户。
9.4 Vim 高级配置
- 永久显示行号:
echo "set nu" >> ~/.vimrc - 语法高亮、自动缩进:Vim 默认支持,适合编程。
9.5 正则扩展(扩展正则)
+:重复前一个字符 1 次以上。?:重复前一个字符 0 或 1 次。():分组匹配。- 使用:
grep -E或egrep支持扩展正则。
十、核心知识点总结
- 程序错误:编译时、运行时、逻辑错误,排查优先级依次降低。
- GCC :Linux 标准编译器,掌握
-c/-o/-lm/-Wall核心参数。 - Make :自动化编译,Makefile 核心是目标 + 依赖 + Tab 命令。
- Vim:三大模式切换,编辑 / 插入 / 命令模式高频操作必记。
- Shell:变量、重定向、管道、正则是文本处理核心。
- Shell 脚本 :条件判断、循环、函数是自动化编程基础,
-x调试必备。