《Linux操作系统》
·
一、《操作系统介绍》
1、操作系统概述
| 项目 | 说明 |
|---|---|
| 定义 | 管理计算机硬件与软件资源的系统软件,提供标准化接口 |
| 主要作用 | 硬件资源管理、进程与任务调度、文件系统管理、安全与用户交互 |
| 主流OS | Linux、Windows、Android、HarmonyOS、macOS、iOS |
2、主流操作系统对比
| 特性 | Linux | Windows | Android | HarmonyOS | macOS | iOS |
|---|---|---|---|---|---|---|
| 是否开源 | 是 | 否 | 部分 | 部分 | 部分 | 否 |
| 核心领域 | 服务器 | 个人电脑 | 移动设备 | 全场景 | 个人电脑 | 手机/平板 |
| 安全性 | 高 | 中等 | 中等 | 高 | 高 | 高 |
| 定制性 | 极高 | 低 | 中等 | 中等 | 低 | 低 |
3、Linux 操作系统核心知识
3.1 从 Unix 到 Linux 发展简史
| 时间/事件 | 说明 |
|---|---|
| 1969(Unix) | 贝尔实验室开发首个Unix,奠定多用户/多任务架构。 |
| BSD分支 | 加州大学伯克利分校加入TCP/IP,丰富网络功能。 |
| Minix | 谭宁邦开发教学系统,启发林纳斯·托瓦兹。 |
| GNU项目 | 理查德·斯托曼发起自由软件运动,提供GCC、Bash等工具。 |
| 1991(Linux内核) | 林纳斯·托瓦兹发布0.01版(C语言,GPL协议),开源生态启动。 |
3.2 Linux 设计哲学:“一切皆文件”
| 核心理念 | 将硬件设备(硬盘、网卡)、进程、网络连接等抽象为文件。 |
|---|---|
| 优势 | • 读写接口统一(read/write),降低学习成本。 • 权限机制复用(chmod直接管理)。 • 新设备加入只需创建文件节点。 • 可用标准文件工具(ls/rm)统一管理。 • 一套文件API适配多种资源,提升开发效率。 |
3.3 Linux 内核版本(关键里程碑)
| 版本 | 发布时间 | 重要特性 |
|---|---|---|
| 0.01 | 1991 | 首个内核,运行bash、gcc,GPL开源。 |
| 1.0 | 1994 | 完整进程调度、文件系统,支持x86。 |
| 2.0 | 1996 | 首次支持多处理器。 |
| 2.6 | 2003 | 模块化设计,支持嵌入式到超算全场景。 |
| 3.0 | 2011 | 强化虚拟化与文件系统。 |
| 5.15 | 2021 | 解决Windows分区(NTFS)读写难题。 |
| 6.6 | 2024 | 安全机制强化,网络设备驱动优化。 |
3.4 Linux 内核 vs 发行版
| 概念 | 定义 | 特点 |
|---|---|---|
| 内核 | 系统核心,管理CPU、内存、磁盘、进程调度等底层操作。 | 由林纳斯·托瓦兹团队维护,持续迭代。 |
| 发行版 | 内核 + 桌面环境 + 应用软件 + 包管理工具。 | 多样化,适应办公、开发、服务器等场景(如Ubuntu适合新手)。 |
3.5 常用 Linux 发行版对比
| 发行版 | 使用场景 | 核心特色 | 学习成本 | 支持周期 |
|---|---|---|---|---|
| Deepin | 桌面 | 国产DDE桌面,类似Windows,预装丰富应用 | 较低 | 社区版灵活 |
| Ubuntu | 桌面/服务器 | 全球流行,LTS长期支持,生态完善 | 适中 | LTS 5年 |
| Fedora | 桌面 | 技术前沿,内核/桌面更新快 | 较高 | 短 |
| Debian | 服务器 | 极稳定,支持ARM等小众硬件 | 较高 | 超长 |
| openSUSE | 服务器 | YaST图形化管理工具,企业级可靠性 | 适中 | 长 |
3.6、Linux 目录结构(FHS 标准)
| 目录 | 功能描述 |
|---|---|
/bin |
存放基本二进制可执行文件,基本命令(ls、cp等),所有用户可执行 |
/etc |
系统配置文件(网络、用户、服务脚本) |
/dev |
硬件设备文件(硬盘、终端) |
/home |
普通用户的主目录 |
/lib |
共享库和内核模块(如 libc.so) |
/usr |
用户程序与数据(应用、开发工具、库、文档) – 类似“程序资源库” |
/root |
超级用户(root)的主目录 |
/tmp |
临时文件,系统重启通常清空 |
/mnt |
临时挂载点(U盘、光盘等) |
/opt |
第三方软件或附加程序存放目录(如 /opt/软件名) |
3.7、Linux 主要应用领域
| 领域 | 说明 |
|---|---|
| 嵌入式 | 智能座舱、数控机床(可裁剪内核,低功耗) |
| 物联网 | 智能家居(支持 MQTT 等协议) |
| 数据分析/科学计算 | 高性能计算、分布式框架 |
| 服务器 | 银行等企业级核心系统(开源、稳定、安全) |
| 软件开发 | GCC、Git、GDB、包管理、跨平台 IDE |
| 虚拟化/云计算 | 支持虚拟机、容器(Docker),资源弹性分配 |
3.8、使用现有的Ubuntu系统
| 快捷键 | 功能说明 |
|---|---|
| Ctrl + Alt + T | 快速打开终端,进入命令行操作界面 |
| Ctrl + Shift + T | 新建终端标签页(同一窗口内打开新会话,避免窗口混乱) |
| Alt + F4 | 关闭当前窗口(浏览器、终端、文档等) |
| Ctrl + PgUp | 切换到上一个终端标签页 |
| Ctrl + PgDn | 切换到下一个终端标签页 |
| Alt + Tab | 在所有打开的应用程序间快速切换 |
| Ctrl + Shift + "+" | 将命令行界面字体放大 |
| Ctrl + "-" | 将命令行界面字体缩小 |
| Ctrl + L | 清屏(清除终端屏幕内容,将提示符移到屏幕顶端) |
| Tab | 自动补全命令或文件名 |
二、《Linux操作系统命令》
1、常用基础命令
| 命令名 | 英文单词 | 功能 | 常见格式 | 常用选项 | 加选项后的功能 |
| ls | list |
显示目录中文件及其属性信息
|
ls [选项][文件或目录] | 无 |
列出当前工作目录中的文件信息
|
| -l |
以长格式显示文件详细信息(权限
、所有者、大小、修改时间等)
|
||||
| -h |
与 -l 结合使用,以人类可读格式显
示文件大小(如234M,2G)
|
||||
| -a |
显示所有文件和目录,包括隐藏文
件(以 . 开头的文件)
|
||||
| -t |
按修改时间排序,最新的排在前面
|
||||
| -R |
递归列出所有子目录及其内容
|
|
类别
|
详情 |
|
文件类型
|
l:链接文件 - : 普通文件
d: 目录文件 p: 管道文件
b: 块设备文件 c: 字符设备文件
s: 套接字文件
|
|
文件权限
|
所有者权限 如:rwx
组用户权限 如:rwx
其他用户权限 如:rwx
r:读权限 w:写权限
x:可执行权限 -:无权限
|
|
硬链接数
|
多少个路径指向同一个文件索引
普通文件:被引用的次数
目录文件: 2 + 子目录数
|
|
所有者
|
所有者的名称,如:linux
|
|
所属组
|
所有者所属组的组名,如:linux
|
| 命令名 | 英文单词 | 功能 | 常见格式 | 常用操作 | 常用操作功能 |
| cd |
change
directory
|
切换目录
路径可以是相对路径也可
以是绝对路径
|
cd [选项][目录路径] | 无 |
切换到当前使用者的家目录
|
| .. |
切换至当前位置的上一级目录
|
||||
| - |
切换至上次所在目录
|
||||
|
pwd
|
print
working
directory
|
显示当前工作目录的路径
|
pwd | 无 |
显示所在目录的绝对路径
|
|
clear
|
clear
|
清除终端界面已有内容
|
clear | 无 | 清除终端界面已有内容 |
|
exit
|
exit |
关闭当前终端
|
exit | 无 |
关闭当前终端
|
| touch | touch |
创建空文件与修改时间戳
|
touch [选项] [文件名]
|
无 |
创建一个空内容的文本文件;
如果文件已经存在,则会对文件的时间
进行修改操作
|
| -d |
设置日期,
格式:touch -d "YYYY-MM-DD" 文件名
|
||||
| mkdir |
make
directories
|
创建目录
|
mkdir [选项] [目录名] | 无 |
创建一个新的目录文件,若创建的目标
目录已经存在,则会提示已存在而不继
续创建
|
| -p |
递归创建多级目录
|
||||
| rm |
remove
|
删除文件或目录
|
rm [选项] [目录或文件] | 无 |
rm 可删除文件;对于空目录,使
用 rmdir 命令删除
|
| -rf |
-f 强制删除文件而不询问;
-r 通常与 -f 结合使用,以强制递归删除目录及其内容,避免单独使用 -r 时的交
互提示或权限问题
|
||||
| cp |
copy
|
复制文件或目录
|
cp [选项] 源文件或目录
目标文件或目录
|
无 |
复制文件
|
| -r |
递归复制,复制目录及其下所有子目录、文件
|
||||
| -f | 强制覆盖已存在的目标文件,不提示 | ||||
| -v | 显示复制过程的详细信息 | ||||
| mv |
move
|
对文件和目录进行
剪切和重命名操作
|
mv [选项] [源文件或目录]
[目标文件或目录]
|
无 |
同一目录下对文件和目录进行重命名操
作;
不同目录下对文件和目录进行剪切操作
|
|
shutdown
|
shutdown
|
关闭服务器的系统
|
shutdown 【选项】【时间】 | -r |
将系统立即重启,同时可以设定当前服
务器在指定时间自动重启,格式为
“shutdown -r +分钟” 或者
“shutdown -r 时间”
|
| -h |
将系统立即关机,同时可以设定当前服
务器在指定时间自关机,格式为
“shutdown -h +分钟” 或者
“shutdown -h 时间”
|
||||
|
reboot
|
reboot
|
重新启动计算机 |
reboot
|
无 |
用于重启系统,简单快捷
|
2、通配符
| 命令元素 | 含义 | 功能 | 常见使用场景格式 | 举例说明 |
|---|---|---|---|---|
| * | 星号 | 匹配任意数量(包括零个)的任意字符 | ls [文件名包含] rm [文件名包含] 等 | .txt: 匹配所有以.txt结尾的文件;test: 匹配所有以test开头的文件或目录名; |
| ? | 问号 | 匹配单个任意字符 | ls [文件名包含?] cp [文件名包含?] 等 | file?.txt: 匹配所有以file开头,后面跟一个任意字符且以.txt结尾的文件名; |
| [] | 方括号 | 匹配方括号内指定的任意一个字符 | ls [文件名包含[字符范围]] mv [文件名包含[字符范围]] 等 | [abc]*: 匹配以a、b或c开头的文件或目录;[0-9].txt: 匹配所有文件名由单个数字开头且以.txt结尾的文件; |
3、用户及用户组命令
| 命令名 | 英文单词 | 功能 | 格式 | 常用选项 | 加选项后的功能 |
|---|---|---|---|---|---|
su |
substitute user | 切换用户,默认切换到 root 下 | su [选项] [用户名] |
- |
以登录方式切换用户,加载目标用户的操作环境设置 |
sudo |
superuser do | 以管理员权限执行命令 | sudo [命令] |
无 | 让普通用户以 root 权限执行指定命令 |
useradd |
user add | 创建新用户 | useradd [选项] 用户名 |
-m |
用户目录不存在时则自动创建 |
passwd |
password | 修改用户密码 | passwd [用户名] |
无 | 不指定用户名,修改当前用户密码;指定用户名,修改指定用户密码(只有 root 用户可以修改) |
whoami |
who am i | 显示当前登录用户的用户名 | whoami |
无 | 无 |
userdel |
user delete | 删除用户 | userdel [选项] 用户名 |
-r |
删除用户的同时,用户所有资源也会删除 |
|
usermod
|
user
modify
|
修改用户属性
|
usermod [选项] 用户名
|
-g |
修改用户的初始组;
|
|
groupadd
|
group add
|
创建新的用户组
|
groupadd [选项] 组名
|
无 | 按默认规则创建组(系统自动分配GID) |
| -g | 指定新组的GID(组标识符) | ||||
|
groupdel
|
group
delete
|
删除用户组
|
groupdel 组名 | 无 | 只能删除空的用户组 |
| id |
identity
|
显示用户 UID、GID
及所属组信息
|
id [用户名] | -u | 仅显示用户UID(用户标识符) |
| -g | 仅显示用户GID(组标识符) |
4、软件包类型及命名规则
| 属性 | .deb 包 |
.rpm 包 |
|---|---|---|
| 所属系列 | Debian 系列 | Red Hat 系列 |
| 打包内容 | 应用程序的二进制文件、配置文档、帮助页面等整合打包 | 应用程序的二进制文件、配置文档、帮助页面等整合打包 |
| 元数据信息 | 采用标准化元数据格式,包含软件版本、依赖关系、安装路径等 | 采用标准化元数据格式,包含软件版本、依赖关系、安装路径等 |
| 适用系统 | Debian、Ubuntu 等 | CentOS、Fedora 等 |
| 管理工具 | apt(在线管理,自动处理依赖)dpkg(离线管理,直接操作本地包) |
yum/dnf(在线管理,自动处理依赖)rpm(离线管理,需手动处理依赖) |
| 命名规则 | 包名_主版本-次版本_架构.deb |
包名-主版本-次版本.发布号.架构.rpm |
| 示例 | code_1.99.3-1744761595_amd64.deb |
httpd-2.4.53-1.el8.x86_64.rpm |
5、两种主流软件包管理机制对比
| 特性 | Debian 系(.deb) | Red Hat 系(.rpm) |
|---|---|---|
| 包格式 | .deb |
.rpm |
| 依赖管理工具 | apt(或 apt-get) |
yum 或 dnf |
| 仓库配置 | /etc/apt/sources.list |
/etc/yum.repos.d/*.repo |
| 适用场景 | 桌面环境、开发环境(如 Ubuntu) | 服务器环境、企业级部署(如 CentOS) |
| 依赖处理 | 灵活,支持更多社区软件 | 稳定,依赖关系严格验证 |
6、软件包管理工具分类
| 分类维度 | Debian系(APT) | Red Hat系(YUM/DNF) | Arch系(Pacman) |
|---|---|---|---|
| 包格式 | .deb |
.rpm |
.pkg.tar.zst |
| 底层工具 | DPKG | RPM | N/A(Pacman直接管理) |
| 高级工具 | APT(apt、apt-get) | DNF(dnf install、dnf update) | Pacman |
| 依赖处理 | APT自动处理 | DNF自动处理 | Pacman自动处理 |
| 仓库管理 | 集中式配置(sources.list) | 分散式配置(.repo文件) | 配置文件 /etc/pacman.conf |
| 特点 | 用户友好,适合桌面环境 | 稳定可靠,企业级使用 | 滚动更新,轻量高效 |
7、dpkg
7.1、dpkg介绍
| 特性 | 说明 | 示例场景 |
|---|---|---|
| 仅支持 .deb 文件 | 仅能安装、卸载、查询 .deb 格式的软件包 不支持其他格式(如 .rpm、源码包) |
手动下载 .deb 文件后离线安装:sudo dpkg -i package.deb |
| 离线操作 | 无需联网即可操作,但需提前下载所有依赖包 | 无网络环境的服务器或设备中批量安装软件包 |
| 依赖需手动解决 | 安装时若缺少依赖,直接报错,需用户手动补全依赖包 | 安装 wps.deb 时提示缺少 libpng12-0需手动下载并安装该依赖包 |
7.2、dpkg常用命令
| 命令名 | 英文单词 | 功能 | 常见格式 |
|---|---|---|---|
dpkg -i |
install | 安装本地 .deb 软件包 | dpkg -i package.deb |
dpkg -r |
remove | 卸载软件包,保留配置文件 | dpkg -r package |
dpkg -P |
purge | 彻底卸载软件包(含配置文件) | dpkg -P package |
dpkg -l |
list | 列出系统中已安装的所有软件包 | dpkg -l |
dpkg -s |
status | 显示指定软件包的详细状态信息 | dpkg -s package |
dpkg -L |
listfiles | 列出软件包安装到系统中的所有文件路径 | dpkg -L package |
8、apt
8.1、apt介绍
| dpkg 短板 | apt 解决方案 | 示例 |
|---|---|---|
| 依赖手动处理 | 自动解析依赖链(支持多层间接依赖) | 安装办公软件时,apt 能自动处理其依赖的字体库及字体库依赖的基础组件等多层依赖,而 dpkg 需用户手动查找安装各层依赖 |
| 仅支持离线操作 | 联网访问软件源(下载/更新/搜索远程包) | 执行 apt update 命令可更新软件源列表,apt install nginx 能从源下载安装 Nginx 软件包,dpkg 则只能在提前下载好相关 .deb 包及依赖包的离线环境操作 |
| 命令复杂度高 | 提供简化的语义化命令(如 apt install) |
dpkg 安装软件命令选项复杂,而 apt install 软件名简单易懂,新手也能快速上手 |
8.2、apt命令
| 命令 | 功能 | 示例 |
|---|---|---|
apt update |
更新软件源列表和包版本信息(必做) | 安装/升级前必须执行 |
apt install 软件包名 |
安装包及依赖(含推荐包) | sudo apt install git |
apt install -y 软件包名 |
静默安装(无需确认) | sudo apt -y install git |
apt remove 软件包名 |
卸载包(保留配置文件) | sudo apt remove git |
apt purge 软件包名 |
彻底卸载(删除包 + 配置文件) | sudo apt purge git |
8.3、dpkg和apt的对比
| 对比维度 | dpkg | apt(apt-get/apt) |
|---|---|---|
| 依赖处理 | 完全手动:需提前下载并安装所有依赖包 | 自动解析:联网搜索并下载缺失的依赖包(含间接依赖) |
| 操作模式 | 纯离线:仅操作本地 .deb 文件 | 在线为主:支持从软件源更新、搜索、安装远程包 |
| 核心命令 | dpkg -i(安装本地包)、dpkg -r(卸载) |
apt install(联网安装)、apt update(更新源) |
| 网络依赖 | 无(不支持联网) | 必须联网(需连接软件源) |
| 适用场景 | 离线环境、本地包调试、系统底层维护 | 日常联网安装、更新、管理软件 |
| 依赖风险 | 手动处理易导致版本冲突或依赖断裂 | 自动匹配兼容版本,风险更低 |
| 与系统交互 | 直接操作 /var/lib/dpkg/ 数据库 |
间接调用 dpkg 执行底层操作 |
压缩/解压缩命令
9、压缩/解压缩命令
9.1、压缩命令
| 压缩格式 | 压缩命令格式 | 命令解释 |
|---|---|---|
.tar |
tar -cvf [目标文件名].tar [源文件或目录] |
将
|
.tar.gz |
tar -zcvf [目标文件名].tar.gz [源文件或目录] |
将 [源文件或目录] 压缩成 [目标文件名].tar.gz-z:使用 gzip 算法进行压缩 |
.tar.bz2 |
tar -jcvf [目标文件名].tar.bz2 [源文件或目录] |
将 [源文件或目录] 压缩成 [目标文件名].tar.bz2-j:使用 bzip2 算法进行压缩 |
9.2、解压缩命令
| 压缩格式 | 解压缩命令格式 | 命令解释 |
|---|---|---|
.tar |
tar -xvf [归档文件名].tar |
将
|
.tar.gz |
tar -zxvf [归档文件名].tar.gz |
将 [归档文件名].tar.gz 解压缩-z:使用 gzip 算法进行解压缩 |
.tar.bz2 |
tar -jxvf [归档文件名].tar.bz2 |
将 [归档文件名].tar.bz2 解压缩-j:使用 bzip2 算法进行解压缩 |
9.3、压缩/解压缩命令
① 压缩
| 压缩格式 | 压缩命令格式 | 命令解释 |
|---|---|---|
.zip |
zip -r [压缩文件名].zip [源文件或目录] |
将 [源文件或目录] 压缩成 [压缩文件名].zip 文件-r 选项用于递归压缩目录 |
.rar |
rar a [压缩文件名].rar [源文件或目录] |
将 [源文件或目录] 压缩成 [压缩文件名].rar 文件a 表示添加文件到压缩包;需提前安装 rar 工具 |
② 解压
| 压缩格式 | 解压缩命令格式 | 命令解释 |
|---|---|---|
.zip |
unzip [压缩文件名].zip |
将 [压缩文件名].zip 文件解压缩到当前目录 |
.rar |
unrar e [压缩文件名].rar |
将 [压缩文件名].rar 文件中的内容解压到当前目录;需提前安装 unrar 工具 |
10、文件操作命令
| 命令名 | 英文单词 | 功能 | 常见格式 | 常用选项 | 加选项后的功能 |
|---|---|---|---|---|---|
cat |
concatenate | 查看文件内容 | cat 文件名 |
-n |
显示行号 |
tail |
tail | 显示文件尾部内容 | tail 文件名(默认显示文件最后10行) |
-n-f |
显示文件最后 n 行 实时追踪文件新增内容 |
head |
head | 显示文件头部内容 | head 文件名(默认显示文件前10行) |
-n |
显示文件前 n 行 |
echo |
echo | 在终端输出文本或变量值 | echo [字符串 / 变量] |
无 | 无 |
>, >>(重定向) |
redirect | >:覆盖写入文件;>>:追加写入文件 |
echo "内容" > 文件名echo "内容" >> 文件名 |
无 | >:目标文件不存在时,创建文件并写入;目标文件存在时,覆盖写入文件;>>:目标文件不存在时,创建文件并写入;目标文件存在时,追加写入文件; |
grep |
grep | 在文件中搜索指定的字符串信息 | grep "字符串" 文件名 |
-i-R |
-i:统一匹配大小写文本-R:从当前目录所有的文件中查找符合条件的字符串 |
|(管道) |
pipe | 连接两个命令,将前一个命令的输出作为后一个命令的输入 | 命令1 | 命令2 | 命令3 |
无 | 无 |
find |
find | 查找文件或目录 | find 路径 -name "文件名" |
-name-type |
-name:指定名称-type:指定类型(f 为文件,d 为目录) |
| chmod | change mode | 修改文件权限 | chmod 文件的权限 文件名/目录名 | -R | 递归修改目录及其子目录/文件权限 |
|
cut
|
cut
|
按指定分隔符切割文本
行,并提取指定字段
|
cut -d "分隔符" -f 字段号 文件名
|
-d
-f
|
-d:可自定义文本切割时所依据的符号;
-f:用于指定要提取的字段位置;
如果截取的字段连续,使用-隔开;
如果截取的字段不连续,使用,隔开;
|
|
chown
|
change
owner
|
修改文件所属的用户和
组
|
chown 所有者 : 组 文件或目录名
|
-R
|
递归修改目录及其子目录/文件所属 的用户和组
|
|
chgrp
|
change
group
|
修改文件的所属组
|
chgrp组 文件或目录名 |
-R
|
递归修改目录及其子目录/文件的所属组
|
| 类别 | 具体内容 | 说明 |
|---|---|---|
| 用户分类标识 | u(普通用户 / 文件所有者)g(组用户)o(其他用户)a(所有用户) |
区分不同类型的用户 |
| 权限修改操作符 | +(添加权限)-(删除权限)=(修改权限,覆盖原有) |
用于调整用户权限 |
| 权限标识 | r(可读,对应数字 4)w(可写,对应数字 2)x(可执行,对应数字 1)-(无权限,对应数字 0) |
用于表示文件或目录的不同访问权限 |
11、硬链文件命令
① 硬链接(Hard Link)
硬链接是指向同一个 inode (索引节点)的不同目录条目(文件名)的数量;• 创建硬链接命令:ln• 命令格式:ln 被链接的文件 创建硬链接文件名称• 验证硬链接• 查看inode号:ls -i• 特点:• 硬链接文件与源文件共享相同的inode和数据块;• 删除源文件后,硬链接仍可访问数据(直到所有硬链接被删除);• 不能跨文件系统(如无法从ext4分区链接到NTFS分区);• 不能链接目录(防止文件系统循环问题);
② 符号链接(Symbolic Link)
符号链接又称之为软链接 ,是一种特殊的文件类型,它指向另一个文件或目录;• 创建符号链接:• 命令格式:ln -s 被链接的文件/目录(绝对路径) 创建软链接文件名称• 验证符号链接:• 查看符号链接指向:ls -l• 查看inode号:ls -i• 特点:• 符号链接与源文件有不同的inode;• 删除源文件后,符号链接失效(称为”断链”);• 可以跨文件系统;• 可以链接目录;
| 对比维度 | 硬链接 (Hard Link) | 符号链接 / 软链接 (Symbolic Link) |
|---|---|---|
| 本质 | 同一文件的多个入口(共享 inode) | 指向原文件路径的快捷方式 |
| 创建命令 | ln |
ln -s |
ls -l 标识 |
-(普通文件),无 -> |
l(链接文件),带 -> 指向目标 |
| 删除原文件 | 链接依然有效 | 链接失效(死链) |
| 跨分区 / 目录 | 不支持 | 支持 |
| 典型用途 | 防止误删、文件备份 | 快捷方式、跨目录引用 |
12、网络相关命令
① 相关命令
| 术语 | 作用 | 示例 |
|---|---|---|
| IP地址 | 设备在网络中的唯一逻辑标识 | 192.168.1.100 |
| 子网掩码 | 划分IP的网络段与主机段 | 255.255.255.0 |
| 网关 | 数据包转发到其他网络的出口 | 192.168.1.1 |
| DNS服务器 | 将域名解析为IP地址 | 8.8.8.8 (Google DNS) |
| MAC地址 | 网卡的物理唯一标识 | 00:1A:2B:3C:4D:5E |
| 命令名 | 英文单词 | 功能 | 常见命令 |
|---|---|---|---|
| ifconfig | ifconfig | 查看及临时配置网络接口参数 如:IP 地址、子网掩码、MAC 地址等等 |
ifconfig |
| ipconfig | ipconfig | 查看 Windows 网络接口的配置信息 如:IP 地址、子网掩码、网关等等 |
ipconfig |
| ping | ping | 测试网络连通性 通过发送 ICMP 数据包检查目标主机是否可达 |
ping <目标地址> 如: ping www.baidu.com |
| ip | ip | 多功能网络管理工具(如查看所有接口 IP 地址等等) | ip addr show |
② IP地址分配方式
动态IP地址工作流程:动态IP地址通过 DHCP的发现(Discover)->提供(Offer)->请求(Request)->确认 (Ack)四步流程(简称 “DORA”)完成分配 ,结合租期续租和释放机制,实现IP地址的动态管理,高效利 用有限的 IP 资源(尤其是 IPv4 地址紧张的环境);
| 步骤 | 触发条件 | 关键动作 | 结果 |
|---|---|---|---|
| Discover | 设备接入网络 | 客户端广播寻找服务器 | 服务器响应Offer |
| Offer | 服务器收到Discover | 服务器广播提供IP及配置 | 客户端选择IP并发送Request |
| Request | 客户端选择Offer中的IP | 客户端广播确认所选IP | 服务器验证并发送Ack |
| Ack | 服务器验证Request合法性 | 服务器最终分配IP,客户端应用配置 | 客户端正式接入网络,启动租期计时器 |
③ 静态ip 与 动态ip
| 维度 | 静态 IP | 动态 IP |
|---|---|---|
| 获取方式 | 手动配置(ipv4.method manual) |
自动从 DHCP 服务器获取(ipv4.method auto) |
| IP 地址 | 固定不变 | 会随租期 / 重启变化 |
| 适用场景 | 服务器、需要固定访问的设备 | 普通终端、家庭设备 |
| nmcli 配置 | ipv4.method manual |
ipv4.method auto |
13、其他辅助命令
| 命令名 | 英文单词 | 功能 | 常见规格 | 常用选项 | 加选项后的功能 |
| man | manual | 帮助手册查看用户命令 | man 1 [命令名] | 无 | 无 |
| 帮助手册查看系统调用 | man 2 [命令名] | 无 | 无 | ||
| 帮助手册查看C库函数 | man 3 [命令名] | 无 | 无 | ||
| history | history | 查看命令历史 | history | 无 | 查看历史记录 |
| -c | 清空命令历史记录 |
三、《Linux操作系统下文本编辑》
1、文本编辑器的介绍
在 Linux 系统中,文本编辑器是基础且重要的工具,用于创建、修改和查看各种文本文件,如配置文件、 脚本文件等;
| 对比维度 | Vim | Nano | VSCode | Gedit |
|---|---|---|---|---|
| 功能特性 | 语法高亮、代码折叠、脚本自动化、多语言支持、智能补全、正则查找替换、可高度定制、插件丰富 | 基本语法高亮,仅提供基本编辑功能 | 插件丰富,支持多窗口分屏 | 字体行号设置等基本编辑功能,简单插件扩展 |
| 易用性 | 初期学习曲线陡峭,掌握快捷键和模式后效率高 | 极易上手,命令提示清晰 | 操作简便易入门,界面友好 | 操作方便易上手,界面简洁 |
| 跨平台性 | 支持 Linux、Unix、Windows、macOS 等主流系统 | 主要用于 Linux 和 Unix 系统 | 支持 Windows、Linux、macOS | 主要用于 GNOME 桌面环境的 Linux 系统 |
| 适用场景 | 文本处理、系统配置文件编辑、代码开发、服务端运维等专业场景 | 简单文本快速编辑、临时信息记录 | 软件开发、网页设计等各类编程场景 | 日常文本编辑、简单文档处理 |
2、命令模式下的命令
| 分类 | 命令 | 功能描述 |
|---|---|---|
| 光标移动 |
h, j, k, l | 分别向左、下、上、右移动一个字符 |
| 0 | 移动到当前行的行首 | |
| $ | 移动到当前行的行尾 | |
| gg | 移动到文件的第一行 | |
| G | 移动到文件的最后一行 | |
| nG 或 :n | 移动到第 n 行(例如 10G 或 :10 移动到第 10 行) | |
| 文本删除 |
x | 删除当前光标所在的字符 |
| dd | 删除当前行 | |
| ndd | 删除从当前行开始的 n 行(例如 3dd 删除 3 行) | |
| daw | 删除当前单词 | |
| 文本复制粘贴 |
yy | 复制当前行 |
| nyy | 复制从当前行开始的 n 行(如 3yy 复制 3 行) | |
| P(大写) | 在当前光标位置之后粘贴复制或删除的内容 | |
| p(小写) | 在当前光标位置之前粘贴复制或删除的内容 | |
| 撤销与重做 | u | 撤销上一步操作 |
| Ctrl + r | 重做上一步撤销的操作 | |
| 查找 |
/关键词 | 从当前位置向下查找匹配关键词的内容 |
| ?关键词 | 从当前位置向上查找匹配关键词的内容 | |
| n | 查找下一个匹配项 | |
| N | 查找上一个匹配项 |
3、插入模式下的命令
| 命令 | 功能描述 |
|---|---|
| i | 在当前光标位置之前插入文本 |
| a | 在当前光标位置之后插入文本 |
| o | 在当前行的下一行插入新行并进入插入模式 |
| O | 在当前行的上一行插入新行并进入插入模式 |
| I | 将光标移动到当前行的行首,并进入插入模式 |
| A | 将光标移动到当前行的行尾,并进入插入模式 |
4、底行模式下的命令
| 命令 | 功能描述 |
|---|---|
| :W | 保存当前编辑的文件 |
| :w 文件名 | 将文件另存为指定的文件名 |
| :q | 退出 Vim(如果文件未修改) |
| :q! | 强制退出 Vim,不保存对文件的修改 |
| :wq | 保存文件并退出 Vim |
| :x | 功能与 :wq 类似,保存文件并退出,但在某些情况下性能更优 |
| :set nu | 显示行号 |
| :set nonu | 取消行号显示 |
| :s/旧内容/新内容 | 在当前行中,将第一个匹配到的旧内容替换为新内容 |
| :s/旧内容/新内容/g | 在当前行中,将所有匹配到的旧内容替换为新内容 |
| :%s/旧内容/新内容/g | 在整个文件中,将所有匹配到的旧内容替换为新内容 |
| :%s/旧内容/新旧内容/gc | 在整个文件中,将所有匹配到的旧内容替换为新内容,替换前会询问是否确认 |
四、《环境变量》
1、常见环境变量
| 变量名 | 作用 | 典型值示例 |
|---|---|---|
| PATH | 定义系统查找可执行文件的目录路径(多个目录用:分隔) | /usr/local/sbin:/usr/local/bin:/usr/sbin |
| HOME | 当前用户的主目录路径(存放个人文件和配置文件) | /home/linux |
| USER | 当前登录用户的用户名 | root |
| LANG | 系统默认的语言和字符编码(影响命令输出、日期格式等) | zh_CN.UTF-8 或 en_US.UTF-8 |
| PWD | 当前工作目录的绝对路径(实时更新) | /home/linux |
| SHELL | 当前用户使用的 Shell 解释器路径(如 Bash、Zsh 等) | /bin/bash 或 /bin/zsh |
| EDITOR | 默认文本编辑器路径(系统或用户自定义的编辑器) | nano 或 vim |
2、查看环境变量的方法
| 方法 | 适用场景 | 命令格式 | 示例 | 说明 |
|---|---|---|---|---|
echo $变量名 |
查看单个环境变量的值 | echo $变量名 |
echo $PATH 或 echo $HOME |
最简洁的方式,直接输出指定变量的值,仅显示单个变量,新手最常用 |
printenv |
查看所有环境变量 | printenv 或 printenv 变量名 |
printenv 或 printenv PATH |
列出所有环境变量(按字母顺序),也可后跟变量名单独查看;不包含用户自定义变量 |
env |
功能与 printenv 几乎一致 |
env 或 env 变量名 |
env 或 env HOME |
等价于 printenv,通常可互换使用,侧重显示环境变量(不包含局部变量) |
3、环境变量的配置方法
3.1、永久配置环境变量
| 配置类型 | 作用范围 | 配置文件 | 是否需要管理员权限 | 生效方式 | 特点 |
|---|---|---|---|---|---|
| 用户级配置 | 当前用户 | ~/.bashrc等 | 否 | source 文件名或重启终端 | 个性化定制仅自己可用 |
| 系统级配置 | 所有用户 | /etc/profile等 | 是(需sudo) | source 文件名或新用户登录 | 统一配置影响所有用户 |
3.2、临时配置与永久配置对比
| 特性 | 临时配置 | 永久配置 |
|---|---|---|
| 生效范围 | 局限于当前终端会话;一旦关闭当前终端会话,配置效果即消失,不会影响其他终端会话状态 | 用于所有新开启的终端会话;后续新打开的终端,均会应用该配置 |
| 配置位置 | 无需特定文件存储配置信息;直接在命令行输入执行相关命令即可完成配置 | 需将配置信息写入系统特定的配置文件(如 ~/.bashrc 等);这些文件会在终端启动时被读取,以加载配置 |
| 撤销方式 | 关闭当前终端会话,配置自动失效;或者在当前会话内手动执行重置命令来撤销配置 | 打开对应的配置文件(如 ~/.bashrc),找到并删除之前写入的配置行,保存文件后,新打开的终端会话将不再应用该配置 |
| 适用场景 | 主要用于短期测试新功能、临时使用一些辅助工具等;例如,临时设置一个环境变量来测试程序在特定环境下的运行情况 | 适用于长期使用的工具配置、开发环境搭建等;比如,将常用的命令别名、路径添加等配置写入配置文件,方便每次打开终端都能使用 |
4、PATH环境变量包含目录
| 目录路径 | 作用 |
|---|---|
/bin/ |
存放系统基本命令(如 ls/cp/rm),所有用户可用 |
/sbin/ |
存放系统管理命令(如 sudo/reboot),需管理员权限 |
/usr/bin/ |
存放用户级常用命令(如 python/git) |
/usr/local/bin/ |
存放当前用户通过 pip 等工具安装的仅对当前用户可用的可执行文件 |
~/.local/bin/ |
当前用户的私有可执行文件目录(如 pip 安装的用户级工具) |
~/bin/ |
当前用户自定义的私有目录(部分系统默认不包含,需手动添加) |
5、PATH环境变量配置
5.1、临时配置PATH
语法规则:• 前置(优先查找): export PATH=新路径:$PATH• 优先使用新路径命令,适用于替换系统命令或使用新版本工具” ;• 后置(后备查找): export PATH=$PATH:新路径• 系统仅在默认路径找不到命令时,才会查找新路径,适用于安全添加个人工具;• 验证方式:• echo $PATH:查路径顺序• which 命令名:验调用路径• 局限性:仅当前终端会话有效,关闭或新开终端即失效;• 风险提示:前置配置易覆盖系统命令,致工具异常,操作需谨慎;
5.2、永久配置PATH
① 用户级 vs 系统级
| 对比维度 | 用户级配置 | 系统级配置 |
|---|---|---|
| 配置文件 | ~/.bashrc(或 ~/.bash_profile、~/.profile) |
/etc/profile(或 /etc/environment) |
| 影响范围 | 仅当前用户 | 所有用户(全局生效) |
| 适用场景 | 个人开发环境定制,如添加个人脚本目录、本地编译的工具 | 系统级通用工具配置,如安装公共软件(Java、Python)让所有人可用 |
| 修改权限 | 普通用户即可编辑(自己家目录下的文件) | 需要 root 权限(sudo vim /etc/profile) |
| 生效条件 | ① source ~/.bashrc(仅当前会话立即生效)② 重启终端或重新登录后全局生效 |
① source /etc/profile(仅当前会话立即生效)② 重启终端或重新登录后全局生效 |
| 验证方式 | echo $PATH(查看路径顺序);which 命令名(确认调用路径) |
同上 |
| 风险等级 | ⚠️ 中。配置错误只会影响自己的终端使用,不影响其他用户。 | ⚠️ 高。配置错误可能导致所有用户无法使用 ls、cd 等基础命令,系统级故障。 |
| 备份建议 | 修改前建议备份:cp ~/.bashrc ~/.bashrc.bak |
必须备份:cp /etc/profile /etc/profile.bak |
② 两种配置方式的共同规则
| 配置方式 | 语法(写入配置文件) | 查找顺序 | 适用场景 |
|---|---|---|---|
| 前置配置 | export PATH=新路径:$PATH |
新路径 → 系统原路径 | 想优先使用自己的工具或新版本(如替换系统旧命令) |
| 后置配置 | export PATH=$PATH:新路径 |
系统原路径 → 新路径 | 安全添加个人工具,不影响系统原有命令 |
6、配置PATH要点总结
优先级:• 用户级与系统级配置冲突时,用户级优先;• 不同 shell (如 Bash/Zsh)要修改对应配置文件;• 撤销配置:• 用户级:直接删除对应配置文件里的 export 行;• 系统级:需管理员权限,用 sudo 编辑 /etc/profile ,删除相关行;• 注意事项:• 配置时要保留 $PATH 变量,勿直接覆盖原 PATH;• 采用绝对路径(如:/usr/bin ),不用相对路径;• 路径有空格时,用引号包裹,如 "$PATH:/home/user/my tools";
7、配置PATH常见错误
| 错误类型 | 常见错误示例 | 正确做法 | 原因 / 说明 |
|---|---|---|---|
| 错误覆盖原有 PATH | export PATH=/new/dir(直接赋值,丢弃了系统原路径) |
export PATH="$PATH:/new/dir"(用 $PATH 保留系统原路径) |
系统默认路径(如 /bin、/usr/bin)保存着 ls、cd 等基础命令。直接覆盖后,系统会找不到这些命令,导致终端功能异常甚至无法使用。 |
| 路径拼写错误 | • 字母写错:/usr/local/bin → /usr/local/bin(手误拼错)• 系统级配置中使用 ~/.local/bin(~ 是用户级专用符号,系统级不识别) |
• 仔细检查路径拼写,确保每个字母和斜杠正确 • 系统级配置中必须使用绝对路径,如 /home/linux/.local/bin |
路径错误会导致系统找不到对应目录,PATH 中添加的路径形同虚设。~ 在用户级配置文件(如 ~/.bashrc)中可以正常解析,但在系统级配置文件(如 /etc/profile)中可能无法正确展开,导致路径无效。 |
| 未添加可执行权限 | 将目录加入 PATH,但文件没有执行权限(x) |
chmod +x /home/linux/first.sh(添加执行权限) |
即便目录在 PATH 中,如果文件没有 x(执行)权限,系统依然无法执行该文件,会提示“命令未找到”或“权限不够”。 |
| 配置文件未生效 | • 用户级:修改 ~/.bashrc 后,当前终端未执行 source,新终端也需重新加载。• 系统级:修改 /etc/profile 后,当前终端未执行 source,未重启终端或重新登录。 |
• 用户级:修改后执行 source ~/.bashrc 让当前终端立即生效;或者直接新开一个终端(自动加载)。• 系统级:修改后执行 source /etc/profile 让当前终端立即生效;或者重启终端/重新登录系统。 |
配置文件修改后,已打开的终端不会自动感知,必须重新加载配置(source)或新开终端才能生效。系统级配置生效范围更广,需要所有用户重新登录才能完全生效。 |
五、《gcc与gdb的使用》
1、GNU工具集
| 工具类别 | 工具名称 | 主要功能 | 应用场景 |
|---|---|---|---|
| 编译器 | gcc/g++ | 将C/C++源代码转换为可执行程序 | 各类C/C++项目开发 |
| 调试工具 | gdb | 辅助代码调试,设置断点、查看变量、分析内存 | 软件开发调试阶段,排查程序错误 |
| 项目构建工具 | make | 依据Makefile自动处理编译依赖 | 源文件多、依赖关系复杂的项目 |
| 目标文件分析工具 | objdump | 反汇编目标文件,查看二进制文件内容 | 分析程序底层实现,排查目标文件相关问题 |
| 链接工具 | ld | 合并多个目标文件及库文件为可执行文件 | 编译流程最后阶段,处理目标文件链接 |
| 静态库管理工具 | ar | 创建、修改和操作.a静态库文件 | 大型项目中复用通用代码模块场景 |
2、GCC介绍
| 文件后缀 | 文件类型 | 含义说明 |
|---|---|---|
| .c | 源代码文件 | 采用 C 语言编写的源代码文件 |
| .cpp | 源代码文件 | 使用 C++ 语言编写的源代码文件 |
| .h | 头文件 | 源程序中包含的头文件,用于声明函数、变量等 |
| .o | 目标文件 | 源代码经过编译但尚未链接的中间文件 |
| .a | 库文件 | 由目标文件构成的静态库文件 |
| .so | 库文件 | 动态库文件 |
3、gcc常用选项
| 选项 | 功能 | 语法格式 | 应用场景 |
|---|---|---|---|
| -O | 指定编译输出文件的名称 | gcc 源文件 -o 输出文件名 |
日常开发中明确输出文件名称,便于管理 |
| -c | 只进行编译和汇编,不进行链接,生成目标文件 | gcc -c 源文件 |
生成目标文件用于后续链接,或单独分析目标文件 |
| -E | 仅对源文件进行预处理,输出预处理后的代码 | gcc -E 源文件 -o 预处理后文件名 |
检查预处理指令执行情况 |
| -S | 将源文件编译为汇编代码 | gcc -S 源文件 |
分析编译器生成的汇编代码,学习汇编语言 |
| -g | 生成调试信息(供 gdb 调试) | gcc -g 源文件 |
程序调试阶段排查问题 |
| -Wall | 开启大部分常见警告信息 | gcc -Wall 源文件 |
发现代码中潜在问题,提高代码质量 |
| -std | 指定编程语言标准 | gcc -std=标准 源文件 |
确保代码按特定标准编译,增强兼容性和可移植性 |
4、gdb调试命令
| 命令分类 | 具体命令 | 命令说明 | 使用示例 |
|---|---|---|---|
| 程序运行控制 | run / r | 运行程序,直至遇到断点或程序结束 | r |
| continue / c | 继续运行程序,直到下一个断点或程序结束 | c |
|
| 代码查看 | list / l | 列出源代码 |
|
| 断点操作 | break / b | 在指定行号或函数处设置断点 | b 10(在第10行设置断点)b main(在 main 函数处设置断点) |
| info b | 查看已设置断点的信息 | info b |
|
| delete / d | 删除指定编号的断点 | d 2(删除编号为2的断点) |
|
| 调试方式 | next / n | 逐过程调试,不进入函数内部 | n |
| step / s | 单步调试,进入函数内部 | s |
|
| 变量查看 | print / p | 查看变量的值 | p n(查看变量 n 的值) |
| display | 每次程序停止时自动显示变量的值 | display n(自动显示变量 n 的值) |
六、shell编程
1、常见shell类型对比
| shell名称 | 描述 | 特点 | 典型使用场景 | Ubuntu中的情况 |
|---|---|---|---|---|
| Bash | 默认交互式shell,Linux系统中最常用的 | 支持命令补全、历史记录、自定义别名;功能丰富且高度可配置 | 日常命令行操作、脚本编写 | 默认用户登录shell,兼容传统shell脚本 |
| sh | 符合POSIX标准的基础shell,用于保证脚本兼容性 | 语法简单,功能精简;不支持交互式增强功能(如补全) | 系统服务启动脚本、兼容性脚本 | 实际指向dash(轻量替代) |
| Zsh | 扩展了bash的特性,功能强大的现代化shell | 智能命令补全、主题美化;支持插件化定制;兼容bash大部分语法 | 开发者、追求高效交互的用户 | 需手动安装 |
| Fish | 强调易用性,以交互友好性为核心的shell | 自动命令建议、语法高亮;配置简单,开箱即用;语法与bash不完全兼容 | 新手用户、注重交互体验的场景 | 需手动安装 |
| Dash | 轻量高效的shell,专为执行速度优化 | 启动快,资源占用极低;仅支持基础脚本功能(符合POSIX标准) | 系统初始化脚本、低资源环境 | /bin/sh 的默认实现 |
2、第一个shell脚本
shell基本结构:• 文件扩展名:通常习惯用 .sh 作为扩展名,不是强制要求。关键在于文件开头的 shebang 行;• shebang 行:一般写成 #!/bin/bash ,这行的作用是指定执行脚本的 shell 解释器路径;• 注释规范:• 单行注释:以 # 开头,#后面的是注释内容;• 多行注释:在 Bash 中可以用 <<EOF 和 EOF 包裹起来;
3、shell 脚本执行方式对比
| 执行方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 直接运行 | 符合常规程序执行逻辑,具备独立可执行性;执行效率高,无需额外启动解释器进程 | 需手动操作赋予权限,步骤稍繁琐;环境变化时(如跨系统、路径变更)权限可能需重新设置 | 需频繁且高效执行的固定任务脚本;正式环境中已稳定的脚本部署 |
| shell解释器运行 | 无需提前设置文件执行权限,操作便捷;可灵活选用不同shell解释器 | 每次执行都要明确指定解释器,相对直接运行,启动解释器的开销较大,效率略低 | 脚本开发阶段的临时测试;验证脚本在不同shell下的运行情况 |
| 使用source执行 | 在当前shell环境内执行,不产生新子进程,资源开销小;脚本内变量、函数等可直接作用于当前环境,配置修改即时生效 | 不能脱离当前shell环境独立运行;脚本出现错误可能会干扰当前shell环境的正常状态 | 加载或更新shell配置文件(如.bashrc);需要在当前环境立即应用脚本配置的场景 |
4、变量的类型对比
| 变量类型 | 定义 | 作用域 | 声明方式 | 命名规范 | 典型场景 |
|---|---|---|---|---|---|
| 系统变量 | 由系统预定义存储环境信息(如路径、用户) | 所有shell进程和脚本 | 系统自动设置,无需声明 | 全大写 | 获取用户主目录、检查当前用户权限、配置默认路径等 |
| 用户变量 | 用户自定义,仅限当前shell会话或脚本 | 当前shell进程或脚本 | 变量名=值(等号两边无空格) |
小写或驼峰式 | 临时存储计算结果、传递数据给函数、脚本内部配置等 |
| 环境变量 | 用户自定义,可在当前shell及其子进程中访问 | 当前shell及其所有子进程(如脚本、新终端) | 直接声明:export 变量名=值提升已有变量: 变量名=值; export 变量名 |
全大写 | 多脚本共享配置、系统参数(如PATH)等 |
| 局部变量 | 作用域受限的变量 隐式:未export的用户变量 显式:函数内local声明的变量 |
隐式:当前shell或脚本 显式:仅在函数内部有效,函数执行后销毁 |
隐式:直接定义 显式: function() { local 变量名=值; } |
小写或驼峰式 | 避免变量污染全局作用域、保护敏感数据(如密码)、函数内部临时存储等 |
5、Shell 特殊变量与位置参数汇总表
| 变量类型 | 变量名 | 核心含义 | 详细说明 / 用法 |
|---|---|---|---|
| 特殊变量 | $0 | 当前脚本的名称 | 执行脚本时,自动获取当前脚本的文件名 / 路径 |
| 特殊变量 | $? | 上一条命令的退出状态码 | 0 表示上一条命令执行成功;非 0 表示命令执行失败 |
| 位置参数 | $1 - $9 | 脚本执行时传递的第 1-9 个参数 | 执行脚本时传入的参数,按顺序对应获取,例如 ./test.sh a b 中,$1=a,$2=b |
| 位置参数 | ${10} 及以上 | 脚本执行时传递的第 10 个及以上的参数 | 用于获取序号大于 9 的参数,必须用大括号包裹,例如 、{11} |
| 位置参数 | $* | 脚本执行时传递的所有参数(不含脚本名) | 在循环中会将所有参数当作一个整体处理 |
| 位置参数 | $@ | 脚本执行时传递的所有参数(不含脚本名) | 在循环中会逐个处理每个参数,是遍历参数的推荐用法 |
| 位置参数 | $# | 脚本执行时传递的参数总个数(不含脚本名) | 自动统计传入的参数数量,常用于参数校验、循环次数控制 |
6、Shell 变量修饰关键字汇总表
| 关键字 | 核心定义 | 语法格式 | 典型应用场景 | 注意事项 |
|---|---|---|---|---|
| readonly | 修饰变量为只读属性,赋值后不可再修改 | 1. readonly 变量名=值2. 先赋值再 readonly 变量名 |
1. 定义程序中的常量(如配置文件路径、版本号)2. 保护关键变量不被意外修改 | 1. 只读变量不能使用 unset 命令删除2. 重新定义同名变量也无法覆盖只读属性 |
| unset | 取消变量的定义,删除后变量引用返回空值 | unset 变量名 |
1. 释放不再使用的变量,节省内存2. 清除包含敏感信息的变量(如密码) | 1. 对 readonly 修饰的变量使用 unset 会报错2. 若变量未定义,使用 unset 不会报错 |
| local | 在函数内部使用,创建仅在函数内有效的局部变量 | function 函数名() { local 变量名=值; } |
1. 避免函数内变量污染全局作用域2. 保护函数内部的临时数据 | 1. 只能在函数内部使用,函数外使用 local 会报错2. 局部变量仅在当前函数及嵌套函数内生效 |
7、shell中的算术运算
| 方式 | 语法格式 | 特点 | 示例 |
|---|---|---|---|
| expr 命令 | expr 操作数1 运算符 操作数2 |
较古老,操作数与运算符间需空格,部分运算符(如 *)需转义 |
expr 5 \* 3 |
双括号 ((...)) |
((变量 = 表达式)) |
Bash 推荐,语法简洁,支持 C 风格运算符(如 ++、+= 等),可直接修改变量值 |
((a = 5 + 3)) |
$((...)) |
$((表达式)) |
用于直接替换算术表达式结果,类似 expr 但语法更现代,无需空格,支持常见算术运算符 | echo $((5 + 3)) |
8、shell中的数组
8.1、Shell 数组基础定义与创建赋值汇总表
| 分类 | 操作方式 | 语法格式 | 详细说明 | 示例 |
|---|---|---|---|---|
| 基础特性 | 数组核心规则 | - | 1. 仅支持一维数组,无需预先定义大小2. 元素可为字符串、数字等任意类型3. 元素间用空格分隔,索引默认从 0 开始 | - |
| 创建赋值 | 直接赋值法(批量赋值) | 数组名=(元素1 元素2 元素3 ...) |
通过括号包裹元素列表,一次性给数组赋值多个元素 | arr=(1 2 3 "hello" "world") |
| 创建赋值 | 逐个赋值法(指定索引赋值) | 数组名[索引]=元素 |
为数组指定索引的元素赋值,索引不存在则创建新元素,可实现稀疏数组 | arr[0]=100; arr[5]=200 |
8.2、Shell 数组元素访问与长度获取汇总表
| 操作类型 | 语法格式 | 核心作用 | 详细说明 | 示例 |
|---|---|---|---|---|
| 访问单个元素 | ${数组名[索引]} |
获取数组指定索引的单个元素 | 索引可为数字或变量,索引从 0 开始 | ${arr[0]}、${arr[$i]} |
| 访问所有元素(独立参数) | ${数组名[@]} |
获取数组所有元素,每个元素作为独立参数 | 适合循环遍历数组,是遍历数组的推荐用法 | for item in "${arr[@]}"; do echo $item; done |
| 访问所有元素(整体字符串) | ${数组名[*]} |
获取数组所有元素,合并为一个整体字符串 | 所有元素间用默认空格分隔,适合整体输出 | echo "${arr[*]}" |
| 获取数组长度(元素个数) | ${#数组名[@]} 或 ${#数组名[*]} |
统计数组中元素的总个数 | 两种写法效果一致,常用于循环次数控制、参数校验 | echo ${#arr[@]} |
8.3、Shell 数组常用操作汇总表
| 操作类型 | 语法格式 | 核心作用 | 详细说明 | 示例 |
|---|---|---|---|---|
| 添加元素 | 末尾添加 | 数组名+=("新元素") |
自动在数组最大索引 + 1 的位置添加新元素,无需手动计算索引 | arr+=("new_item") |
| 添加元素 | 指定索引添加 | 数组名[新索引]="新元素" |
为指定索引赋值,索引不存在则创建新元素,可实现稀疏数组 | arr[10]="specify_item" |
| 修改元素 | 重新赋值 | 数组名[索引]="新值" |
通过索引重新赋值,覆盖原有索引的元素值 | arr[0]="updated_value" |
| 删除元素 | 删除指定索引元素 | unset 数组名[索引] |
删除指定索引的元素,数组会变稀疏,原有索引不会重排 | unset arr[2] |
| 截取数组 | 截取指定范围元素 | ${数组名[@]:起始索引:长度} |
获取数组从起始索引开始、指定长度的元素;长度可选,缺省则截取到数组末尾 | ${arr[@]:2:3}、${arr[@]:1} |
9、read和echo命令
9.1、read命令
| 选项 | 功能描述 | 示例 |
|---|---|---|
-p |
显示提示信息,引导用户输入 | read -p "输入姓名: " name → 显示“输入姓名: ” |
-s |
静默模式,输入内容不显示(适用于密码等敏感信息) | read -s -p "密码: " pass → 输入时屏幕无显示 |
-n N |
读取 N 个字符后自动结束,无需按回车 | read -n 2 input → 输入两个字符后立即结束 |
-t N |
设置超时时间(秒),超时后退出并返回非零状态码 | read -t 3 input → 3 秒无输入则自动退出 |
-a |
将输入按空格分割为数组,存入指定变量 | read -a arr → 输入 abc def,则 arr[0]=abc, arr[1]=def |
-r |
禁止反斜杠转义(将反斜杠视为普通字符) | read -r home → 输入 C:\home,则 home=C:\home |
-d |
指定行结束符(默认为回车) | read -d ':' input → 输入 a: 时,input=a |
9.2、echo命令
| 选项 | 作用 | 示例 |
|---|---|---|
-e |
启用转义字符解析(如 \n、\t) |
echo -e "第一行\n第二行" |
-n |
不换行输出(默认会自动添加换行符) | echo -n "Loading..." |
-E |
禁用转义字符解析(默认行为,部分 Shell 需显式指定) | echo -E "a\nb" → 输出 a\nb |
| 转义字符 | 含义 | 示例(echo -e) |
|---|---|---|
\n |
换行 | "第一行\n第二行" → 第一行换行后第二行 |
\t |
制表符(Tab 缩进) | "列1\t列2" → 列1(Tab)列2 |
\\ |
反斜杠 \ |
"C:\\Windows" → C:\Windows |
\033[31m |
红色文本(需搭配 \033[0m 重置) |
"\033[31m错误\033[0m" → 显示红色“错误” |
10、shell中的条件判断
① if语句
| 结构类型 | 语法格式 | 说明 |
|---|---|---|
基本 if |
if (表达式); thenshell语句fi |
当 (表达式) 的结果为非零值(即条件为真)时,执行 then 后的语句;(表达式) 是 Bash 特有的算术表达式,支持 +、-、*、/、>、< 等运算符 |
if-else |
if (表达式); thenshell语句1elseshell语句2fi |
当表达式为真时,执行 shell语句1;否则执行 shell语句2 |
if-elif-else |
if (表达式1); thenshell语句1elif (表达式2); thenshell语句2elif (表达式3); thenshell语句3...elseshell语句4fi |
按顺序检查每个表达式,一旦某个表达式为真,则执行对应的语句块,并跳过后续所有 elif 和 else;如果所有表达式都为假,则若有 else 则执行 else 后的语句,否则直接退出 |
② test命令
| 方面 | 说明 |
|---|---|
| 基本功能 | 比较数值和字符串、对条件进行测试,常与 if 语句配合使用 |
| 语法格式 | test 表达式 或 [ 表达式 ](后者本质是调用 test 命令) |
| 注意事项 | - 使用 [ ] 形式时,方括号与表达式之间必须有空格- 引用变量时建议用双引号引起来,防止变量为空或含空格时出错 - test 命令返回状态码 0 表示条件成立,非 0 表示不成立 |
| 执行逻辑 | test 是一个可执行程序,执行时其参数(表达式、运算符等)会传递给 main 函数的 argc 和 argv,因此表达式中的参数、运算符前后必须添加空格 |
③ 数值判断
作用:用于比较两个整数的大小关系,返回状态码0 (真)或1 (假);• 适用场景:• 脚本中需要比较数字大小的逻辑(如判断年龄、版本号等等);• 循环条件(如while [ $i -le 10 ]);
| 操作符 | 含义 | 等价数学符号 |
|---|---|---|
-eq |
等于 | == |
-ne |
不等于 | != |
-gt |
大于 | > |
-lt |
小于 | < |
-ge |
大于等于 | >= |
-le |
小于等于 | <= |
④ 字符串判断
作用:用于判断字符串的状态(是否为空、非空),比较字符串间是否相等、大小关系等;返回状态码 0 (真) 或 1 (假);• 适用场景:• 验证用户输入是否合规(如用户名、密码是否为空,是否符合格式要求);• 文本处理中筛选、过滤特定字符串内容(如在日志文件中查找特定关键词);• 程序逻辑中根据字符串状态决定执行分支(如在 if - then - else 结构中判断);
| 操作符 | 作用 | 示例(假设 str="hello") |
|---|---|---|
-z STRING |
如果 STRING 的长度为 0(即空字符串),则条件为真 | -z "$str" → 假(str 非空) |
-n STRING |
如果 STRING 的长度大于 0(即非空字符串),则条件为真 | -n "$str" → 真(str 非空) |
STRING1 =/== STRING2 |
如果两个字符串相等,则条件为真。= 和 == 等价 |
"$str" =/== "hello" → 真(注:示例中 =/== 应理解为 = 或 ==) |
STRING1 != STRING2 |
如果两个字符串不相等,则条件为真 | "$str" != "world" → 真 |
STRING1 '>' STRING2 |
如果 STRING1 按字典序大于 STRING2,则条件为真。 注意: > 需要转义 |
"$str" '>' "abc" → 真 |
STRING1 '<' STRING2 |
如果 STRING1 按字典序小于 STRING2,则条件为真。 注意: < 需要转义 |
"$str" '<' "world" → 真 |
⑤ 逻辑判断
作用:逻辑判断用于组合多个条件表达式,形成更复杂的判断;• 适用场景:• 多条件筛选:同时满足多个条件时执行操作(如年龄 > 18 且 分数≥60);• 容错处理:多个条件中只要满足一个即可执行操作(如文件存在 或 目录可写);• 权限验证:验证用户是否属于特定角色或组(如用户是 root 或 管理员组);
| 操作符 | 含义 | 示例(假设 a=10, b=20) |
|---|---|---|
-a |
逻辑与(AND),同时都满足 | [ "$a" -gt 5 -a "$b" -lt 30 ](真) |
-o |
逻辑或(OR),满足其一即可 | [ "$a" -eq 0 -o "$b" -eq 20 ](真) |
! |
逻辑非(NOT),取反 | [ ! -d "$dir" ] → 若目录不存在则为真 |
⑥ 文件判断
• 作用:用于检查文件或目录的状态(是否存在、类型、权限等),返回状态码 0 (真) 或 1 (假);• 适用场景:• 脚本初始化与依赖检查:在执行核心逻辑前,确保必要的文件或目录存在且状态正确;• 文件操作前的安全检查:避免误操作导致数据丢失或权限问题;• 条件性执行任务:根据文件状态决定执行不同的分支;• 权限管理与安全控制:限制脚本只在特定权限下执行;
| 操作符 | 作用描述 | 示例(假设 file="test.txt") |
|---|---|---|
-e FILE |
检查文件/目录是否存在 | [ -e "$file" ] → 存在则为真 |
-f FILE |
检查是否为普通文件 | [ -f "$file" ] → 是普通文件则为真 |
-d FILE |
检查是否为目录 | [ -d "/etc" ] → 是目录则为真 |
-r FILE |
检查当前用户是否有可读权限 | [ -r "$file" ] → 可读则为真 |
-w FILE |
检查当前用户是否有可写权限 | [ -w "$file" ] → 可写则为真 |
-x FILE |
检查当前用户是否有可执行权限 | [ -x "$script.sh" ] → 可执行则为真 |
-s FILE |
检查文件是否存在且非空(文件大小 > 0) | [ -s "$log.log" ] → 非空则为真 |
-L FILE |
检查是否为符号链接(不验证链接是否有效) | [ -L "$link" ] → 是符号链接则为真 |
FILE1 -nt FILE2 |
检查 FILE1 是否比 FILE2 新(修改时间更新) | [ "$new.txt" -nt "$old.txt" ] → 新则为真 |
FILE1 -ot FILE2 |
检查 FILE1 是否比 FILE2 旧(修改时间更旧) | [ "$old.txt" -ot "$new.txt" ] → 旧则为真 |
⑦ [[ ]]的使用
在 shell 编程中,[[ ... ]] 是 Bash 提供的高级条件测试语法,比传统的 [ ... ] 更强大、更灵活;• 基本语法:if [[ 条件表达式1 ]]; thenshell语句1elif [[ 条件表达式2 ]]; thenshell语句2elseshell语句3fi• 主要优势:• 无需转义特殊字符,语法更简洁:在 [[ ... ]] 中,传统 [ ... ] 需要转义的特殊符号(如 >、<、! 等)可直接使用,无需添加反斜杠 \ 或引号包裹;• 支持短路求值,提升执行效率:逻辑操作符 &&(逻辑与)和 ||(逻辑或)具备短路特性;• 当 && 左侧条件为假时,右侧条件不再执行;• 当 || 左侧条件为真时,右侧条件不再执行;• 语法更友好,贴近自然逻辑:[[ ... ]] 的条件表达式结构更接近自然语言,无需记忆 -a(逻辑与)、-o(逻辑或)等符号,直接使用 &&/||,降低学习成本;• 安全处理未定义变量:若变量未定义,[[ ... ]] 会将其视为空字符串,避免 [ ... ] 可能触发的语法错误;
⑧ 对比条件判断的三种情况
| 语法形式 | 数值比较示例 | 字符串比较示例 | 文件测试示例 | 兼容性特点 | 适用场景 |
|---|---|---|---|---|---|
(…) |
((a == b)) |
不适用 | 不适用 | 仅适用于 Bash 等支持算术扩展的 shell | 专注于数值计算、循环计数等纯算术运算场景 |
test ([…]) |
["$a" -eq "$b"] |
["$str1" = "$str2"] |
[-f "$file"] |
适用于传统 shell 脚本,各类 Unix 系统及不同版本 shell 兼容性强 | 对兼容性要求极高,需在老旧版本 shell 或不同类型 shell 环境中稳定运行的脚本 |
[[…]] |
[[$a -eq $b]] |
[[$str1 = $str2]] |
[[ -f $file ]] |
仅适用于 Bash 等现代 shell,在非 Bash 环境中不可用 | Bash 脚本开发,处理字符串、文件相关判断及简单逻辑组合场景 |
⑨ case...in 语句
| 项目 | 详细内容 |
|---|---|
| 语法结构 | case 变量 in模式1) 命令序列1 ;;模式2) 命令序列2 ;;*) 默认命令序列 ;;esac |
| 关键符号 | case、in、esac、;;、* ) |
| 模式匹配 | 支持字符串、数值,以及通配符 *(任意)和 ?(单个字符) |
| 优势 | ① 简洁直观 ② 支持通配符匹配 |
| 适用场景 | 交互式菜单、文件类型分类、系统状态处理 |
⑩ select...in语句
示例代码:
select choice in 启动 停止 重启 退出
do
case $choice in
启动) echo "正在启动...";;
停止) echo "正在停止...";;
重启) echo "正在重启...";;
退出) break;;
*) echo "无效选择,请重新输入";;
esac
done
| 类别 | 内容 |
|---|---|
| 语法结构 | select 变量 in 选项列表; do 命令序列; done |
| 自动功能 | 生成编号菜单;无效输入循环提示;用户输入数字即可选择 |
| 优势 | 自动编号、输入简化、循环控制灵活、纯内置命令 |
| 适用场景 | 交互配置、功能菜单、循环任务、降低用户输入难度 |
11、shell中的循环结构
① for循环
| 项目 | 详细说明 |
|---|---|
| 适用场景 | 已知要遍历的元素集合(如数组、列表)或明确循环次数,依次迭代执行循环体 |
| 语法形式一:遍历列表 | for 变量 in 列表或数组元素; do...done |
| 语法形式二:数字范围循环 | for ((初始值; 条件; 增量或减量)); do...done |
| 优势 | 语法简洁直观,处理固定集合或确定次数循环时代码逻辑清晰,易于理解和编写 |
| 应用场景 | - 遍历目录下文件 - 对数组元素逐一操作 - 按指定次数执行任务等 |
② while循环
| 项目 | 详细说明 |
|---|---|
| 基本概念 | 根据条件判断结果决定是否执行循环体,条件为真时持续循环,为假时结束。适用于条件动态变化或循环次数不确定的场景。 |
| 语法结构 | while 条件判断; do命令1命令2...done |
| 条件判断说明 | - 可以是数值比较、字符串比较、文件状态检测等多种测试 - 条件为真(返回状态码 0)时继续循环 - 条件为假(返回状态码非 0)时终止循环 |
| 优势 | 灵活性高,能处理复杂条件判断场景,如等待文件出现、监控系统状态变化等。 |
| 应用场景 | - 等待特定条件满足(如等待进程启动) - 动态读取输入(如交互式脚本等待用户输入有效值) - 持续监控资源状态(如磁盘空间、内存使用情况) |
③ until 循环
| 项目 | 详细说明 |
|---|---|
| 基本概念 | 与 while 循环相反:条件为假时持续循环,为真时结束。适用于等待某个条件达成的场景。 |
| 语法结构 | until 条件判断; do命令1命令2...done |
| 执行逻辑 | - 条件判断可为数值比较、字符串比较、文件状态检测等 - 条件为假(返回状态码 ≠ 0)时,继续执行循环体 - 条件为真(返回状态码 = 0)时,立即终止循环 |
| 核心优势 | 在“等待某条件从假变为真”的场景中,逻辑表达更自然清晰。 例如:不必写成 while [ ! -f file.txt ],而可以直接使用 until [ -f file.txt ],避免双重否定。 |
| 典型应用场景 | 等待特定条件满足 – 等待文件出现、进程启动完成等 重试操作直到成功 – 网络连接、命令执行成功等 确保循环体至少执行一次 – 类似其他语言中的 do-while 循环 |
④ break和continue
| 关键字 | 功能 | 使用场景 |
|---|---|---|
break |
强制终止当前所在的循环,程序跳出循环体,继续执行循环后面的代码 | - 找到目标值后提前结束搜索 - 用户输入退出指令时终止程序 - 满足特定条件时不再需要继续循环 |
continue |
跳过当前这一轮循环体中剩余的代码,直接开始下一轮循环 | - 过滤不符合条件的数据 - 忽略错误或无效的输入 - 跳过本轮中不需要处理的特殊情况 |
12、shell中的函数
① 函数定义与调用
在 shell 编程中,函数是一种将多次使用的代码块封装起来的机制,它可以提高代码的复用性和可维护性;• 基础语法• 标准格式:function 函数名(){命令1命令2...[return 返回值] # 可选,返回值范围0-255}• 简化格式(省略function关键字):函数名(){命令1命令2...}• 函数调用:直接使用函数名即可调用,若函数需要参数,直接跟在函数名后面,参数之间用空格分隔;
② 函数参数
| 参数符号 | 含义 | 说明/备注 |
|---|---|---|
$1, $2, ..., $n |
第 1 到第 n 个位置参数 | 分别对应调用函数时传递的第 1 至第 n 个参数 |
$0 |
脚本本身的名称 | 即使在函数内部使用时,$0 仍表示脚本名,而非函数名 |
$# |
传递给函数的参数个数 | 统计位置参数的数量(不含 $0) |
$@ |
所有参数,每个视为独立的个体 | 在循环中会逐个处理每个参数,通常应使用双引号括起来 "$@" |
$* |
所有参数,视为一个整体 | 将所有参数合并为一个字符串,参数之间以 IFS 的第一个字符分隔 |
③ 函数返回值
| 方式 | 功能 | 特点 | 获取方法 | 示例 |
|---|---|---|---|---|
return 语句 |
设置函数的退出状态码(0~255),表示成功(0)或失败(非0) | - 仅能返回整数 - return 立即终止函数- 类似 exit 但仅作用于函数 |
调用函数后立即使用 $? 获取 |
bash<br>check_file() {<br> if [ -f "$1" ]; then<br> return 0<br> else<br> return 1<br> fi<br>}<br>check_file "test.txt"<br>echo $? # 输出0或1<br> |
echo 输出 |
将计算结果通过标准输出返回 | - 可返回任意文本(字符串、数字等) - 需避免在函数中输出额外调试信息,以免干扰返回值 |
使用命令替换 $(函数名) 或 `函数名` 获取 |
bash<br>add() {<br> echo $(($1 + $2))<br>}<br>result=$(add 3 5)<br>echo $result # 输出8<br> |
④ 函数输出捕获
| 方式 | 功能 | 获取方法 | 限制 / 优点 |
|---|---|---|---|
return 语句 |
设置函数退出状态码(0~255) | 调用函数后用 $? 获取 |
限制: - 仅能返回 0~255 整数 - 主要用于表示执行成功/失败,不适合返回数据 |
echo 输出 + 命令替换 |
将计算结果输出到标准输出 | $(函数名) 或 `函数名` 捕获 |
优点: - 支持任意数据类型(字符串、数字、多行内容) - 语法清晰,支持嵌套,现代 Shell 推荐使用 |
七、《Makefile》
1、Makefile介绍
| 分类 | 详细说明 |
|---|---|
| 基本概念 | Makefile 是一个自动化构建脚本,由 目标(target)、依赖(prerequisites)、命令(commands) 组成规则。make 工具读取并执行这些规则。 |
| 主要作用 | ①自动化编译 – 仅重新编译发生变化的文件及依赖,实现增量编译 ② 依赖管理 – 清晰定义源文件、头文件、目标文件之间的依赖关系,确保正确构建顺序 ③ 流程规范 – 统一构建命令和流程,便于团队协作与维护 |
| 为何需要 Makefile |
手动编译繁琐易错,尤其是项目规模扩大时 Makefile 智能判断文件变化,大幅提升编译效率 |
与 make 工具的关系 |
- make 是解释器,读取并解析 Makefile 中的规则- 根据文件时间戳判断是否需要重新编译 - 两者配合实现自动化构建 |
| 适用场景 | 🔹 多文件项目开发 – 自动管理编译顺序,避免手工错误 🔹 增量编译需求 – 修改一个头文件仅重建受影响的源文件 🔹 跨平台构建 – 通过条件判断适配不同 OS 的编译选项、路径、库 🔹 复杂项目分层管理 – 支持递归构建子目录,使用伪目标(如 make all、make clean)统一管理模块 |
2、Makefile核心语法
基本规则:
三要素结构格式及说明:• 格式:• 目标 (target): 依赖 (prerequisites)• 命令 (commands)• 说明:• 目标:可以是要生成的文件,如 可执行文件 app 或目标文件 main.o,也可以是伪目 标(如clean);伪目标不是真实的文件,用于执行特定的操作,如清理生成 的文件,声明伪目标时需通过 .PHONY 关键字显式标记,避免因同名文件存 在而导致目标失效;• 依赖:生成目标所需的文件列表,可以是源文件、头文件或其他目标。目标的更新 依赖于依赖文件的变化,即当依赖文件的修改时间比目标文件新时,目标需 要重新生成;• 命令:生成目标的具体操作,如编译命令gcc -c main.c;每条命令单独一行,且必须 以 Tab 键缩进(不能用空格代替),在命令前添加 @ 符号可禁止命令本身的回 显,仅显示执行结果,用于提升输出可读性;规则示例:• app: main.o utils.ogcc -o app main.o utils.o• 执行逻辑:• make 工具通过比较目标与依赖文件的修改时间戳,仅当依赖文件比目标 “更新” 时,才执行命令重新生成目标,实现增量构建。例如,如果 main.o 和 utils.o 的 修改时间都比 app 旧,那么 make工具不会执行链接命令;若其中一个或两个 依赖文件被修改,app 将被重新链接生成;
3、常用变量惯例
| 变量名 | 说明 |
|---|---|
CC |
指定 C 编译器,通常默认值为 gcc,可重新赋值为其他 C 编译器路径或名称 |
CFLAGS |
用于指定 C 编译器的编译选项,如 -Wall(开启所有警告)、-g(生成调试信息)等 |
CPPFLAGS |
C 预处理器选项,例如包含头文件的路径等 |
CXX |
指定 C++ 编译器,默认可能是 g++,同样可修改为其他 C++ 编译器 |
CXXFLAGS |
C++ 编译器的编译选项,与 CFLAGS 类似,针对 C++ 代码编译 |
OBJS |
通常用于表示目标文件列表,是由源文件编译生成的中间文件 |
LDFLAGS |
链接器的选项,例如指定库文件路径、链接特定的库等 |
LIBS |
需要链接的库文件列表,如 -lm(链接数学库)、-lthread(链接线程库)等 |
AR |
归档器,用于创建和维护静态库,通常为 ar |
ARFLAGS |
归档器的选项,用于指定创建静态库的相关参数 |
RM |
用于指定删除文件的命令,通常默认值为 rm -f,-f 选项表示强制删除,不提示确认 |
4、Makefile中的变量类型对比
| 变量类型 | 定义来源 | 赋值特点 | 作用域 | 典型应用场景 |
|---|---|---|---|---|
| 自定义变量 | 用户自行定义 | 可通过 =(延迟赋值)、:=(立即赋值)、+=(追加赋值)、-=(条件赋值)确定值,灵活性高 |
全局,在 Makefile 文件中都可访问 | 用于存储项目中自定义信息,如源文件路径、自定义编译选项等 |
| 预定义变量 | Make 工具自带 | 有默认值,用户可按需覆盖默认值来调整构建过程 | 全局 | 涉及 Make 工具默认行为的设置,如指定编译器、链接器等 |
| 自动化变量 | 无特定用户定义,在规则命令中起作用 | 在规则的命令中,依据上下文自动获取值,仅在当前规则命令内有效 | 仅在规则的命令中有效 | 在规则命令中处理目标文件和依赖文件相关操作,如编译、链接 |
5、Makefile中的函数
① Makefile之wildcard函数
| 项目 | 详细说明 |
|---|---|
| 函数名称 | wildcard — 获取匹配的文件列表 |
| 功能描述 | 在当前目录及其子目录中,按指定模式 PATTERN 查找并列出所有符合格式的文件名。模式采用 Shell 通配符,如 * 匹配多个字符。 |
| 语法格式 | $(wildcard PATTERN)其中 PATTERN 为文件匹配模式字符串(注意:需使用 $(…) 形式,原文中缺少左括号已修正) |
| 返回值 | 以空格分隔的符合模式 PATTERN 的文件名列表;无匹配文件时返回空字符串。 |
| 示例 | $(wildcard *.c) → 返回当前目录下所有 .c 源文件列表$(wildcard include/*.h) → 返回 include 目录下所有 .h 头文件列表 |
| 应用场景 | 🔹 自动收集源文件 – 自动发现目录下的所有源文件,避免手动维护文件列表,提高项目可扩展性 🔹 条件构建逻辑 – 根据文件是否存在决定构建行为(如条件编译) |
| 注意事项 | ① 仅匹配实际存在的文件,无匹配时返回空值 ② 通配符路径需精确指定,避免意外匹配其他目录 ③ 变量与函数结合使用时,需确保变量值正确 ④ 可用 $(info text) 打印变量值来验证匹配结果(原文 $info text 已修正) |
② Makefile之patsubst函数
| 项目 | 详细说明 |
|---|---|
| 函数名称 | patsubst — 模式替换函数 |
| 功能描述 | 对指定字符串 TEXT 中的单词进行模式匹配替换,将符合模式 PATTERN 的部分替换为 REPLACEMENT。模式中的 % 代表任意字符串,替换模板中的 % 会被自动替换为模式中 % 所匹配的内容。 |
| 语法格式 | $(patsubst PATTERN,REPLACEMENT,TEXT)• PATTERN:包含 % 的匹配模式(如 %.c)• REPLACEMENT:替换模板(如 %.o)• TEXT:待处理的字符串(通常为文件名列表) |
| 返回值 | 替换后的新字符串,原字符串中不符合模式的部分保持不变;若无匹配项,则返回原字符串。 |
| 示例 | $(patsubst %.c,%.o,main.c func.c) → 将 main.c func.c 替换为 main.o func.o |
| 应用场景 | 🔹 源文件与目标文件自动映射:将 .c 文件列表转换为 .o 目标文件列表,避免手动维护重复文件名🔹 批量修改文件路径或扩展名:如将 src/ 目录下的文件映射到 build/ 目录等 |
| 注意事项 | ① % 匹配的是以空格分隔的完整单词(不是字符串片段)② 模式与替换模板中的 % 必须对应相同内容③ 如需在模式或替换模板中使用字面量 %,需用 \% 转义 |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)