一、《操作系统介绍》

 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
-c:创建新的归档文件;

-v:显示详细的操作过程;

-f:指定归档文件的名称

.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 解压缩
-x:从归档文件中提取文件;

-v:显示详细的操作过程;

-f:指定要操作的归档文件

.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 命令名(确认调用路径)
同上
风险等级 ⚠️ 中。配置错误只会影响自己的终端使用,不影响其他用户。 ⚠️ 高。配置错误可能导致所有用户无法使用 lscd 等基础命令,系统级故障。
备份建议 修改前建议备份: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)保存着 lscd 等基础命令。直接覆盖后,系统会找不到这些命令,导致终端功能异常甚至无法使用。
路径拼写错误 • 字母写错:/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 列出源代码

l(l(默认列出当前行附近代码)

l main(列出 main 函数代码)

断点操作 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 (表达式); then
shell语句
fi
当 (表达式) 的结果为非零值(即条件为真)时,执行 then 后的语句;(表达式) 是 Bash 特有的算术表达式,支持 +-*/>< 等运算符
if-else if (表达式); then
shell语句1
else
shell语句2
fi
当表达式为真时,执行 shell语句1;否则执行 shell语句2
if-elif-else if (表达式1); then
shell语句1
elif (表达式2); then
shell语句2
elif (表达式3); then
shell语句3
...
else
shell语句4
fi
按顺序检查每个表达式,一旦某个表达式为真,则执行对应的语句块,并跳过后续所有 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=10b=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 ]]; then
shell语句1
elif [[ 条件表达式2 ]]; then
shell语句2
else
shell语句3
fi
主要优势:
无需转义特殊字符,语法更简洁:在 [[ ... ]] 中,传统 [ ... ] 需要转义的特殊符号(如 >、<、! 等)
可直接使用,无需添加反斜杠 \ 或引号包裹;
支持短路求值,提升执行效率:逻辑操作符 &&(逻辑与)和 ||(逻辑或)具备短路特性;
当 && 左侧条件为假时,右侧条件不再执行;
当 || 左侧条件为真时,右侧条件不再执行;
语法更友好,贴近自然逻辑:[[ ... ]] 的条件表达式结构更接近自然语言,无需记忆 -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
关键符号 caseinesac;;* )
模式匹配 支持字符串、数值,以及通配符 *(任意)和 ?(单个字符)
优势 ① 简洁直观 ② 支持通配符匹配
适用场景 交互式菜单、文件类型分类、系统状态处理

⑩ 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 循环

④ breakcontinue

关键字 功能 使用场景
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 allmake clean)统一管理模块

2、Makefile核心语法

基本规则:

三要素结构格式及说明:
格式:
           • 目标 (target): 依赖 (prerequisites)
           • 命令 (commands)
说明:
          • 目标:可以是要生成的文件,如 可执行文件 app 或目标文件 main.o,也可以是伪目                         标(如clean);伪目标不是真实的文件,用于执行特定的操作,如清理生成                           的文件,声明伪目标时需通过 .PHONY 关键字显式标记,避免因同名文件存                           在而导致目标失效;
          • 依赖:生成目标所需的文件列表,可以是源文件、头文件或其他目标。目标的更新                           依赖于依赖文件的变化,即当依赖文件的修改时间比目标文件新时,目标需                           要重新生成;
          • 命令:生成目标的具体操作,如编译命令gcc -c main.c;每条命令单独一行,且必须                         以 Tab 键缩进(不能用空格代替),在命令前添加 @ 符号可禁止命令本身的回                             显,仅显示执行结果,用于提升输出可读性;
规则示例:
app: main.o utils.o
          gcc -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中的函数

① Makefilewildcard函数

项目 详细说明
函数名称 wildcard — 获取匹配的文件列表
功能描述 在当前目录及其子目录中,按指定模式 PATTERN 查找并列出所有符合格式的文件名。模式采用 Shell 通配符,如 * 匹配多个字符。
语法格式 $(wildcard PATTERN)
其中 PATTERN 为文件匹配模式字符串(注意:需使用 $(…) 形式,原文中缺少左括号已修正)
返回值 以空格分隔的符合模式 PATTERN 的文件名列表;无匹配文件时返回空字符串。
示例 $(wildcard *.c) → 返回当前目录下所有 .c 源文件列表
$(wildcard include/*.h) → 返回 include 目录下所有 .h 头文件列表
应用场景 🔹 自动收集源文件 – 自动发现目录下的所有源文件,避免手动维护文件列表,提高项目可扩展性
🔹 条件构建逻辑 – 根据文件是否存在决定构建行为(如条件编译)
注意事项 ① 仅匹配实际存在的文件,无匹配时返回空值
② 通配符路径需精确指定,避免意外匹配其他目录
③ 变量与函数结合使用时,需确保变量值正确
④ 可用 $(info text) 打印变量值来验证匹配结果(原文 $info text 已修正)

② Makefilepatsubst函数

项目 详细说明
函数名称 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/ 目录等
注意事项 ① % 匹配的是以空格分隔的完整单词(不是字符串片段)
② 模式与替换模板中的 % 必须对应相同内容
③ 如需在模式或替换模板中使用字面量 %,需用 \% 转义
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐