菜单

首页
我的Blog
有趣线上小巧思

联系我

Github
博客园
邮箱
Bilibili
QQ - 请备注(⁎˃ᆺ˂)

Blog - [山大][软院][2025级]Linux期末复习大纲


 Linux 期末总复习

写在前面:本文几乎全部内容来自于对学长学姐遗留笔记的整理,在此感谢各位学长学姐的精心整理与无私馈赠!本文只是从我个人的视角对其进行了更细致的分类整理、通过自己实验命令补充等等。

本文仅供参考啊,我尽可能把能搜寻到的,不超纲很厉害的内容整理进来,当然一定会有遗漏错误,如果大家发现错误遗漏,非常感谢能够联系我 (๑˃̵ᴗ˂̵)!

写在后面:考完出成绩了,刚过A+线,排名啥不是很高,本来不是很想把这个内容再次细细整理、添加编辑发出来,但是感觉也能为大家提供复习的一点点便利。
毕竟几个压缩包里面多个文档反复提取去重还是有些麻烦(没有任何不好的意思!还是要感谢各位学长学姐的细心整理(๑╹ ╹)),
所以又在里面添加了一些我们这届考试时这上面没有的一些内容,重新分类了一下,标记了一下重点,使用AI将原markdown改成了HTML,做了一些美化(当然依旧支持 HTML3.2)。
顺便在这里不是很有资格地简单评价一下:

  • 老师会狠捞,不用太过担心
  • 往届学长学姐都说 PPT 中会有原题,但我们这届貌似没有这么幸运。。。大家还是要以知识掌握为主啊!况且Linux在开发,乃至作为生活主力机都是很舒服的存在,加油学啊!
  • 其实Linux这个东东还是要在实际使用中学啊。当时候整理这查找那,写了这么多,一考试也是抛之于九霄云外了...现在把 Linux 当作了主力系统,花了功夫细学并用一个多月的 nvim,才感到能够参加考试了罢



用⭐来标记重点内容(“重点”判断是基于考频,主观性较强,大家谨慎参考哦)



 一个查询命令的命令 - man

man -k keyword - 手册标题里面找"keyword"

如查询命令 pwd 后输出:
pwd (1) - print name of current/working directory

操作:b 向前翻页,f 向后翻页

 文件系统

系统目录
/根目录,包含所有目录和文件
/bin存放重要的Linux命令的可执行文件
/boot存放用于启动Linux操作系统的所有文件
/dev存放连接到计算机上的设备所对应的文件
/etc存放和特定主机相关的文件和目录,包括系统配置文件
/home一般用户的主目录所在位置
/proc当前进程和系统的信息,仅存在内存
/tmp临时目录,所有人都可读写
/usr综合目录,存放用户使用的命令及应用程序
/sbin存放用于系统管理的命令
/var可变目录,用于存放变动比较频繁的文件;如:系统日志
/rootroot用户主目录
/lib共享库
/lost+found存放文件系统检测产生的碎片文件

特殊设备文件
/dev/null一个特殊的空设备文件,写不满,写入它的任何数据都会被丢弃,读取它会立即返回 EOF(文件结束符)
/dev/zero读不完内容全零
/dev/urandom内容随机

重要配置文件
/etc/shadow密码文件
/etc/passwd用户数据库
/etc/sudoers定义了哪些用户和组可以以root权限执行命令以及具体可以执行哪些命令
/etc/group用户组定义文件。包含系统中所有组的信息,包括组名、组密码(通常不使用)、组ID和组成员列表
/usr/bin/后天安装的程序(非linux自带命令,如gcc、g++)
/binLinux命令,如 ls、cp、mv、rm、bash 等

/tmp 目录特性
/tmp 所有用户可读可写
但是里面的文件都带有粘滞位(t):用户只能删除自己创建的文件
drwxrwxrwt

⭐文件类型
Linux的三种基本的文件类型:普通文件、目录文件、设备文件
Linux中,设备被当成文件来处理
块设备:以块为单位进行随机存取。常见块设备:软盘、光盘、硬盘
字符设备:以单个字符为单位进行顺序存取。常见的字符设备:打印机、终端、键盘、鼠标

隐藏文件与保留词
. 开头是隐藏文件
拓展名是推荐的但不是必须的
保留词:elif fi case esac coproc function !

文件系统类型 (知道Linux能用不能用什么文件系统类型就行了,这里提供拓展知识,了解即可)

文件系统特点适用场景
ext4
(推荐大多数用户)
Linux默认和最成熟的文件系统,向后兼容ext2/ext3,支持最大16TB文件,1EB分区,日志功能确保数据一致性,性能稳定可靠 桌面系统、常规服务器,新手首选,兼容性最好,日常使用,通用需求
XFS
(推荐大文件/高性能需求)
高性能,特别擅长大文件处理,在线调整大小(只能增大,不能缩小),优秀的并行I/O性能,延迟分配技术减少碎片 视频编辑、数据库服务器,大容量存储服务器,RHEL/CentOS/Fedora的默认选择
btrfs
(推荐高级用户/需要高级功能)
写时复制(CoW)、快照功能,内置RAID支持、数据压缩,子卷管理、数据校验,在线碎片整理 需要系统快照和回滚功能,数据完整性要求高,实验性使用(部分发行版如openSUSE已作为默认)
ZFS
(推荐专业存储服务器)
企业级功能:快照、克隆、数据去重,强大的RAID-Z、数据完整性校验,高内存需求,许可证可能不兼容,通常需要单独安装 NAS/存储服务器,企业级数据存储,需要高级存储功能
其他 FAT32/vFAT:不要用于Linux系统安装,仅用于UEFI引导分区或Windows/Linux共享分区,不支持大文件(>4GB),无权限管理
NTFS:主要用于访问Windows分区,不适合安装Linux系统
ext2/ext3:较旧版本,已基本被ext4替代
-

文件路径名特色
普通用户的用户主目录默认为:/home/用户名,可用 ~ 代表主目录

 ⭐cd - 切换工作目录
(Change Directory)

基础用法:
  • cd path - 跳转到指定路径(可以是绝对路径或相对路径)
  • cd ~cd - 返回当前用户的主目录(home目录)
  • cd .. - 返回上一级目录
  • cd - - 返回上一次所在的目录
  • cd / - 跳转到根目录
示例:
cd /home/user/documents # 跳转到documents目录(绝对路径)
cd ../ # 返回上一级目录(相对路径)
cd ~/Desktop # 跳转到桌面目录
cd - # 返回上一次所在的目录

 env - 显示或设置环境变量

基础用法:
  • env - 显示所有环境变量
  • env | grep VAR - 查找特定环境变量
  • env VAR=value command - 临时设置环境变量并执行命令
示例:
env # 显示所有环境变量
env | grep PATH # 查找PATH环境变量
env LANG=C ls # 临时设置语言为英文并执行ls命令

 pwd - 显示当前工作目录的完整路径
(Print Working Directory)

使用命令 pwd 可以显示当前工作目录。可以在任何时候使用pwd命令来判断你所在文件系统中的位置。

基础用法:
  • pwd - 显示当前工作目录的完整路径
  • pwd -P - 显示物理路径(不包含符号链接)
示例:
pwd # 输出:/home/user/documents
cd /etc && pwd # 输出:/etc
cd - && pwd # 返回并输出:/home/user/documents

 ⭐ls && ll - 列出目录内容
(List)

基础用法:
  • ls - 显示当前目录下的文件和目录
  • ls path - 显示指定路径下的文件和目录
  • ls -a - 列出所有文件,包括隐藏文件(以.开头的文件)
  • ls -l - 以长格式显示详细信息(ll通常等同于ls -l)
  • ls -d - 显示目录本身,而不显示其内容
  • ls -R - 递归列出子目录的内容
常用组合:
  • ls -la - 显示所有文件(包括隐藏文件)的详细信息
  • ls -lh - 以人类可读格式显示文件大小(如1K, 234M, 2G)
  • ls -lt - 按修改时间排序,最新的在前
  • ls -lR - 递归列出所有子目录的详细内容
示例:
ls # 显示当前目录内容
ls /home/user # 显示指定目录内容
ls -la # 显示所有文件(包括隐藏文件)的详细信息
ls -l *.txt # 显示所有.txt文件的详细信息
ls -d */ # 列出当前目录下的所有目录

ls * # 不显示 .hidden 文件
ls .* # 显示隐藏文件(包括 . 和 ..,小心使用)
ls .[!.]* # 显示隐藏文件,排除 . 和 ..

ll输出的首字母含义:
d目录
-普通文件
l符号链接文件
b块设备文件
c字符设备文件
三位为一组,每组分别代表文件属主、同组用户和其他用户
 ⭐cp - 复制文件或目录
(Copy)

基础用法:
  • cp src_file dst_file - 复制文件到目标位置
  • cp -i src_file dst_file - 覆盖前询问确认
  • cp -r src_dir dst_dir - 递归复制目录及其所有内容
  • cp -p file1 file2 - 复制时保留文件属性(权限、时间戳等)
  • cp file1 file2 dir/ - 复制多个文件到目录
示例:
cp file.txt backup.txt # 复制并重命名文件
cp file.txt ~/Documents/ # 复制文件到Documents目录
cp -r mydir mydir_backup # 递归复制整个目录
cp -i file.txt existing.txt # 如果existing.txt存在则询问
cp -p file.txt file_copy.txt # 复制并保留原文件属性
cp ../d1 ./my1 # 复制上一级d1目录到当前目录改名为my1
注意:不存在语法 cp a > b(正确用法是 cp a b

 ⭐mv - 移动或重命名文件/目录
(Move)

基础用法:
  • mv old_name new_name - 重命名文件或目录
  • mv file dir/ - 移动文件到目录
  • mv -f file dir/ - 强制移动,覆盖前不询问
  • mv -i file dir/ - 覆盖前询问确认
  • mv dir1 dir2 - 如果dir2存在则移动dir1到dir2内,否则重命名dir1为dir2
示例:
mv file.txt newfile.txt # 重命名文件
mv file.txt ~/Documents/ # 移动文件到Documents目录
mv -i file.txt existing.txt # 如果目标存在则询问
mv mydir ~/Documents/ # 移动目录到Documents下
mv olddir newdir # 重命名目录

 mkdir - 创建目录
(Make Directory)

基础用法:
  • mkdir dirname - 创建单个目录
  • mkdir -p path/to/dir - 递归创建目录,包括不存在的父目录
  • mkdir -m 755 dirname - 创建目录并设置权限
  • mkdir dir1 dir2 dir3 - 同时创建多个目录
示例:
mkdir mydir # 创建目录mydir
mkdir -p a/b/c # 递归创建多层目录(a/b/c)
mkdir -m 755 public_dir # 创建权限为755的目录
mkdir ~/Documents/{work,personal} # 同时创建两个目录

 rmdir - 删除空目录
(Remove Directory)

基础用法:
  • rmdir dirname - 删除空目录(目录必须为空)
  • rmdir -p path/to/dir - 递归删除多层空目录
注意:
  • rmdir 只能删除空目录
  • 删除目录时需要对父目录有写权限
  • 如果目录不为空,需要先清空内容或使用 rm -r
示例:
rmdir empty_dir # 删除空目录
rmdir -p a/b/c # 如果c、b、a都为空,则逐层删除
# 错误示例:rmdir non_empty_dir # 会报错,因为目录不为空

 touch - 创建空文件或更新文件时间戳

基础用法:
  • touch filename - 创建空文件或更新已存在文件的时间戳
  • touch -t [YY]MMDDhhmm filename - 指定时间创建/更新文件
示例:
touch file.txt # 创建空文件file.txt
touch file1.txt file2.txt # 同时创建多个文件
touch -t 202312251200 file.txt # 设置文件时间为2023年12月25日12:00

 ⭐rm - 删除文件或目录
(Remove) - 谨慎使用!

基础用法:
  • rm file - 删除指定文件
  • rm -i file - 删除前逐一询问确认
  • rm -r directory - 递归删除目录及其内容
  • rm -f file - 强制删除,不提示确认
  • rm -rf directory - 强制递归删除目录(谨慎使用!)
示例:
rm file.txt # 删除file.txt文件
rm -i *.txt # 删除所有.txt文件,删除前询问
rm -r mydir # 递归删除mydir目录及其内容
rm -rf mydir # 强制递归删除mydir(不询问,谨慎使用)
警告:rm -rf 命令非常危险,删除后无法恢复,使用时务必确认路径正确!

 which && whereis && find && locate - 文件查找命令

which 作用:在 PATH 环境变量定义的目录中搜索可执行文件的绝对路径

$ which bash
/usr/bin/bash
whereis 作用:搜索命令的二进制文件、手册页(man page)和源代码路径(基于预定义目录,如 /bin, /usr/include 等)

$ whereis bash
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz
⭐find 作用:在指定目录下递归搜索文件,支持复杂条件(文件名、类型、时间戳、权限等)

$ find ./linuxLearning -name ".out"
./linuxLearning/a.out
./linuxLearning/main.out
locate 作用:基于预先生成的文件数据库(mlocate.db)快速搜索文件路径

需要先运行 updatedb 更新数据库

 ⭐ln - 创建链接

ln 用于对一个已经存在的文件再创建一个新的链接,而不复制文件的内容。ln后的链接文件名与物理文件具有相同的权限。

硬链接
ln src dst
原文件名和链接文件名都指向相同的物理位址inode
  • 硬链接主要是增加一个文件的链接数,只要该文件的链接数不为 0,该文件就不会被物理删除
  • 如果删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了原有的内容
  • 不允许对目录建立硬链接(软链接可以)
  • 硬链接不能跨越文件系统(不能跨越不同的分区)
符号链接(软链接)
ln -s src dst
符号链接由于存放的是源文件的路径名,因而如果删除符号链接文件的源文件,符号链接文件将无法找到原有资料

 用户系统

root 用户有系统的最大权限

 w && who && whoami - 查看登录用户

w 显示当前登录用户及他们正在运行的程序

$ w
11:12:27 up 17 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
ren pts/1 - 00:01 11:11m 0.03s 0.02s -bash
who 显示当前登录的用户信息

$ who
ren pts/1 2025-12-20 00:01
whoami 显示当前用户名

$ whoami
ren

 ⭐chmod - 改变文件或目录的权限
(Change Mode)

权限表示:
u (user)文件所有者
g (group)同组用户
o (others)其他用户
a (all)所有用户(ugo的总和)

权限类型:
r (read)读权限 = 4
w (write)写权限 = 2
x (execute)执行权限 = 1

常用权限值:
777rwxrwxrwx(所有用户完全权限,不安全)
755rwxr-xr-x(所有者完全权限,其他用户只读执行)
644rw-r--r--(所有者读写,其他用户只读)
600rw-------(只有所有者可读写)

基础用法:
  • chmod 755 file - 数字方式设置权限(rwxr-xr-x)
  • chmod u+x file - 为所有者添加执行权限
  • chmod g-w file - 移除组用户的写权限
  • chmod o=r file - 设置其他用户只读
  • chmod a+x file - 为所有用户添加执行权限
示例:
chmod 755 script.sh # 设置脚本为可执行
chmod u+x file.txt # 为所有者添加执行权限
chmod g-w,o-r file.txt # 移除组写权限和其他用户读权限
chmod a+rwx file.txt # 为所有用户添加完全权限
chmod u=rw,go=r file.txt # 所有者读写,其他用户只读
chmod +t /tmp/shared # 设置粘滞位

权限详解:
权限值计算:
r = 100 = 4 | w = 010 = 2 | x = 001 = 1 | - = 000 = 0
目录操作权限:
- ls列目录:要有目录的读权限
- 进入目录(cd):要有目录的执行权限
- 在目录下增删文件、子目录:要有目录的写、执行权限(touch,rm,mkdir,rmdir)
复制文件至另一个文件夹:
- 源文件:r
- 源目录:x
- 目标目录:wx

特殊的:粘滞位 (Sticky Bit)

删除或移动权限:文件的所有者、目录的所有者、root用户
但不限制用户对它的修改

设置粘滞位:
chmod +t
chmod 1755

移除粘滞位:
chmod -t

 su && sudo - 用户权限切换

su (Switch User) 切换用户
su 仅仅取得root权限,工作环境不变
su - USERNAME - 完整切换用户环境
sudo (SuperUser DO) 提权
sudo 是完全取得root的权限和root的工作环境
sudo -u USERNAME COMMAND - 以指定用户身份执行命令

 chown - 改变文件或目录的所有者和所属组
(Change Owner)

基础用法:
  • chown user file - 改变文件所有者
  • chown user:group file - 同时改变所有者和所属组
  • chown :group file - 只改变所属组
  • chown -R user directory - 递归改变目录及其内容的所有者
示例:
sudo chown john file.txt # 将file.txt的所有者改为john
sudo chown john:developers file.txt # 同时改变所有者为john,组为developers
sudo chown :staff file.txt # 只将所属组改为staff
sudo chown -R john:users /home/john/data # 递归改变目录所有权
注意:chown 需要 root 权限,通常需要使用 sudo

 ⭐进程系统

进程和线程:
  • 进程是资源分配的基本单位
  • 线程是调度的基本单位
  • 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响
  • 线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间
  • 一个程序至少有一个进程,一个进程至少有一个线程

init 进程(现代 Ubuntu 是 systemd)
- 内核启动后的第一个进程,其 PID=1
- 扮演终结父进程的角色,所有进程追溯其祖先最终都会落到 init 进程身上
- init -> login -> passwd -> shell

 ps - 列出当前进程清单

ps 用于列出当前进程清单。它显示的进程列表是一个静态列表,也就是说,这个列表是在我们启动这个命令时正在运行的进程的快照。


 top - 交互式查看进程

常用选项:
  • d delay - 指定更新的时间间隔(delay),以秒计算
  • n - 指定更新的次数,到达指定次数后将会退出top

 jobs - 显示和控制后台任务

常用选项:
  • -l - 显示后台任务的进程号与信息
  • -p - 只显示后台任务的 PID
  • -n - 显示上次通知用户后,执行状态有更动的后台任务状态
  • -r - 显示执行中的后台任务
  • -s - 显示暂停执行的后台任务

 kill - 向进程发送信号

语法: kill [-option] [signal] {PID | %job ID}

参数说明:
  • signal - 信号,与-s配合使用。不指定则送出信号 15 (TERM)
  • pid - 要终止的进程号
  • job ID - 要终止的进程对应的后台任务编号
  • -s - 指定需要送出的信号,既可以是信号名也可以是对应数字

kill %1 自动使用信号"TERMINATE",终结的是 JobID=1


 nohup - 使进程在用户退出后继续执行

用户退出系统时,一般来说会结束该用户的所有正在运行的程序。如果某些后台程序没有执行完,可以使用 nohup。


格式: nohup {command|script} &

参数说明:
  • command - 命令
  • script - 程序或脚本
  • {a|b} - a和b中必选一项
示例:
题目:将程序 server 放到后台运行,并使其在关闭终端后仍继续运行。

答案:nohup server &

 文本系统

 wc - 统计文件中的字符数、单词数和行数
(Word Count)

基础用法:
  • wc file - 显示文件的行数、单词数、字节数
  • wc -l file - 只显示行数
  • wc -w file - 只显示单词数
  • wc -c file - 只显示字节数
  • wc -m file - 只显示字符数
示例:
wc file.txt # 输出:10 50 300 file.txt(行数 单词数 字节数)
wc -l file.txt # 只显示行数:10
wc -w *.txt # 统计所有.txt文件的单词数
cat file.txt | wc -l # 统计文件行数(通过管道)
ls | wc -l # 统计当前目录下的文件/目录数量

 ⭐vi/vim - 文本编辑器

vim 的三种模式:
命令模式 (Command Mode)vim启动后的默认模式,用于移动光标、删除、复制、粘贴等操作
插入模式 (Insert Mode)用于输入和编辑文本内容,按i、a、o等键进入
末行模式/底行模式 (Last Line Mode)用于保存、退出、搜索替换等操作,按:键进入

模式切换:
命令模式 → 插入模式按i(在光标前插入)、a(在光标后插入)、o(在下方新建行插入)
插入模式 → 命令模式按Esc键
命令模式 → 末行模式按:键
末行模式 → 命令模式执行命令后自动返回,或按Esc取消

vi 选项: vi [-options] [+n] [file]
  • -r - 恢复系统突然崩溃时正在编辑的文件
  • -R - 以只读方式打开文件
  • +n - 指明进入vi后直接位于文件的第n行,如果只有"+"而不指定n,则光标位于文本的最后一行
替换命令: [n1, n2]s/str1/str2/[g][c]
在第n1行到n2行的范围内将字符串str1用str2代替
  • c - 每次替换都由用户确认
  • g - 对行中搜索字符串的每次出现进行替换
  • 不加g - 只对行中搜索字符串的首次出现进行替换
撤销和显示当前状态(命令模式):
  • 撤销上一命令结果:u
  • 显示当前编辑文本的状态:Ctrl-g(包括文本共有多少行、文件名以及目前光标停在多少行)

 cat - 显示文件内容或连接文件
(Concatenate)

基础用法:
  • cat file - 显示文件全部内容
  • cat -n file - 显示内容并打印行号
  • cat -b file - 显示内容,非空行打印行号
  • cat file1 file2 > file3 - 合并file1和file2的内容到file3
  • cat file1 > file2 - 复制file1内容到file2
示例:
cat file.txt # 显示文件全部内容
cat -n file.txt # 显示文件内容并标注行号
cat file1.txt file2.txt > combined.txt # 合并两个文件
cat a > b # 复制文件a到文件b

more 分屏显示文件内容

基础用法:more file

操作键:
- 空格键:向下翻一页
- Enter键:向下翻一行
- b键:向上翻一页
- q键:退出
less 更灵活的分页查看工具(支持上下翻页)

基础用法:less fileless +F file(类似tail -f)

操作键:
- 空格/PageDown:向下翻页
- PageUp/b:向上翻页
- ↑/↓:上下滚动一行
- /pattern:向下搜索pattern
- ?pattern:向上搜索pattern
- n:下一个搜索结果
- N:上一个搜索结果
- q:退出

more只能向下翻页,less支持上下翻页和搜索,功能更强大

 ⭐grep - 在文件中搜索匹配的文本行
(Global Regular Expression Print)

基础用法:
  • grep pattern file - 在文件中搜索匹配pattern的行
  • grep -i pattern file - 忽略大小写搜索
  • grep -r pattern dir/ - 递归搜索目录中的所有文件
  • grep -n pattern file - 显示匹配行及行号
  • grep -v pattern file - 显示不匹配的行
  • grep -c pattern file - 只输出匹配行的计数
  • command | grep pattern - 过滤命令输出
常用选项:
-i忽略大小写
-v反向匹配(显示不匹配的行)
-r递归搜索目录
-n显示行号
-c统计匹配行数
-l只显示包含匹配内容的文件名
-E使用扩展正则表达式

示例:
grep "hello" file.txt # 在file.txt中搜索"hello"
grep -i "error" log.txt # 忽略大小写搜索"error"
grep -r "TODO" ./src # 递归搜索src目录中的"TODO"
grep -n "main" *.c # 在所有.c文件中搜索"main"并显示行号
grep -v "^#" config.conf # 显示不以#开头的行(过滤注释)
ps aux | grep nginx # 过滤进程列表中的nginx

 head && tail - 查看文件开头/结尾内容

head 显示文件开头内容

基础用法:
- head file - 显示文件前10行(默认)
- head -n 20 file - 显示文件前20行
- head -n 5 file - 查看file.txt前5行
tail 显示文件结尾内容

基础用法:
- tail file - 显示文件后10行(默认)
- tail -n 20 file - 显示文件后20行
- tail -f file - 实时监控文件变化(常用于查看日志)
- 按 Ctrl+C 退出

示例:
head /etc/passwd # 查看passwd文件前10行
head -n 5 file.txt # 查看file.txt前5行
tail /var/log/syslog # 查看系统日志后10行
tail -n 20 file.txt # 查看file.txt后20行
tail -f /var/log/nginx/access.log # 实时监控nginx访问日志(Ctrl+C退出)

加一个正则表达式的例子:
grep "^[0-9].*.$"
1. `^` - 匹配行首
2. `[0-9]` - 匹配任意一个数字(0-9)
3. `.*` - 匹配任意数量的任意字符(除换行符外)
- `.` 表示任意单个字符
- `*` 表示前面的字符出现0次或多次
4. `.` - 匹配字面的句点(.)
- 反斜杠 `` 用于转义,因为 `.` 在正则中有特殊含义(匹配任意字符)
5. `$` - 匹配行尾
即以数字开头,中间有任意内容,以句点结尾的行

如果没有匹配文件,通配符保持原样
echo *.nonexistent # 输出:*.nonexistent
并且引号会阻止拓展(单、双引号均可)


 ⭐SHELL 基础

()、$()、$(()) 的区别
()命令分组 - 在子shell中执行命令
$()执行括号内的命令,用输出结果替代整个表达式
$(())算数扩展,等同于 $[]

示例:
# () : 命令分组
(cd /tmp && ls) # 在子shell中改变目录,不影响当前目录
echo $PWD # 仍然是原来的目录,不会变成/tmp

# $() : 执行括号内的命令,用输出结果替代整个表达式
CURRENT_DATE=$(date)
echo "今天是:$CURRENT_DATE"

# $(()) : 算数拓展,等同于 $[]
echo $(( 5 + 3 ))
COUNT=5
echo $(( COUNT * 2 ))

通配符扩展示例:
当前目录下只有文件 abc123
- echo abc*:输出 abc123(通配符 * 扩展为匹配的文件名)
- echo xyz=abc*:输出 xyz=abc*(通配符同样扩展)

如果没有匹配文件,通配符保持原样:
echo *.nonexistent # 输出:*.nonexistent
引号会阻止扩展(单、双引号均可)

变量替换:var=$(command)

$ tms=$(date +%Y-%m-%d)
$ echo $tms
2025-12-17

 ⭐几个引号的区别

单引号
'
单引号括起来的所有字符都作为普通字符出现
双引号
"
由双引号括起来的字符,除$,\,',",`几种符号具有其特殊功能外,其余字符都作为普通字符对待
反引号
`
反引号括起来的内容被Shell解释为命令行,执行时Shell首先执行该命令行,并用它的标准输出结果取代整个反引号(包括反引号括起来的部分)。反引号可以嵌套使用,但是内层的反引号需要用\转义
反斜线
\
如果下一个字符有特殊含义,反斜线屏蔽其特殊含义。有特殊含义的字符包括 & * + ^ $ ` " | ? 这几种

示例:
$ echo '$HOME'
$HOME

$ echo "$HOME"
/home/ren

$ echo `$HOME`
-bash: /home/ren: Is a directory

$ echo a`echo b`
ab

⭐通配符
*可以匹配文件名中的任何字符串
?可以匹配文件名中的任何单个字符
[...]匹配方括号中指定范围内的字符(可以使用横杠-来连接两个字母或数字,以表示范围)
[!...]匹配不在指定范围内的任何字符

注意:echo "a*"echo "a?"等塞到引号里面的都不行(不会进行通配符扩展)

 ⭐管道 (Pipe)

把一个命令在屏幕上的输出传递给另一个命令作为输入。用竖杠 | 表示。

一般形式: 命令1 | 命令2

管道的多个实例:
  • 简单管道:command1 | command2 - 将command1的输出传递给command2
  • 多级管道:command1 | command2 | command3 - 可以连续使用多个管道
  • 管道与重定向结合:command1 | command2 > file - 将最终结果输出到文件
常用示例:
ps aux | grep nginx # 查找nginx进程
cat file.txt | grep "error" | wc -l # 统计包含error的行数
ls -l | grep "^d" # 只列出目录
find . -name "*.log" | xargs grep "ERROR" # 查找日志中的ERROR
history | grep "git" | tail -10 # 查看最近10条git命令

注意事项:
  • 管道只传递标准输出(stdout),错误输出(stderr)不会被传递
  • 使用 command1 2>&1 | command2 可以将错误输出也通过管道传递
  • 管道中的每个命令都在独立的子进程中执行

 ⭐echo $? - 检验退出状态

退出状态:
成功执行:0
失败执行:非0值

 ⭐逻辑、数学运算

命令1 && 命令2只有命令1为真(即成功被执行,返回0),命令2才能够被执行
命令1 || 命令2如果命令1执行失败,那么就执行命令2

Shell的算术扩展:$((exp)) - 提供变量的整数运算机制

expr 命令示例:
# 错误示例
$ expr `expr 2+4`/5
2+4/5

# 正确示例
$ expr `expr 2 + 4` / 5
1

注意:expr必须要有空格,并且涉及 <、>、|、&、* 需要在前面加上 \

 ⭐条件运算符 && test

语法:
  • test expression
  • [ expression ]
注意事项:
  • 使用方括号时,要注意在条件两边加上空格,因为 [ 符号其实是一个命令(程序),而 ] 是一个参数
  • 涉及到变量值($variable)的比较时最好把变量取值用双引号括起来,以免Shell误解变量值
  • 测试结果反映在退出状态中,而不是直接显示输出
  • 条件为真 → 退出状态为0
  • 条件为假 → 退出状态非0
数值比较运算符:
-eq数值相等
-ne数值不等
-lt小于
-gt大于
-le小于等于
-ge大于等于

逻辑操作符:
-a逻辑与 (AND)
-o逻辑或 (OR)
!逻辑非 (NOT)

 ⭐for && while && if - 流程控制

示例:在根目录下filedir目录创建100个文件
# 在执行前先确定有没有该目录,如果没有这个目录则创建,有则不执行
text=/filedir
[ ! -d $text ] && mkdir $text # 检查目录是否存在并创建

for I in {1..100}
do
    touch ${text}/hehe$I
done

 until 循环

循环直到条件成立

语法:
until []
do
    # 命令
done

# 或者是(如果和 do 写在一行要加上 ;)
until []; do
    # 命令
done

 ⭐编程真题

注意:"接收两个数字"即接受的是参数

 ⭐执行 .shell 脚本的几种方式

./script.sh 最常用的方式
- 需要文件有执行权限(chmod +x script.sh)
- 在当前shell的子shell中执行
- 脚本中设置的变量不会影响当前shell
bash script.sh 使用bash解释器执行
- 不需要执行权限
- 在子shell中执行
- 可以明确指定解释器(sh、zsh等)
source script.sh

. script.sh
在当前shell中执行
- 不需要执行权限
- 脚本中设置的变量会影响当前shell
- 常用于加载配置文件(如 .bashrc)
./script.sh & 后台执行
- 需要执行权限
- 在后台子shell中执行
- 立即返回终端控制权
nohup ./script.sh & 后台执行且忽略挂起信号
- 用户退出后脚本仍继续运行
- 输出默认重定向到 nohup.out
- 适合长时间运行的任务

提示:推荐使用 ./script.sh 方式执行脚本,需要先用 chmod +x script.sh 添加执行权限

⭐常用命令真题
显示当前目录下文件名以 abc 开头同时以 123 结尾的文件ls abc*123
在后台执行 ./myprog.sh./myprog.sh &
列出当前目录下的所有目录文件(不列出其他文件)ls -d */
获取系统当前日期和时间(格式:YYYY-MM-DD_HH:MM:SS)date +"%Y-%m-%d_%H:%M:%S"

参数处理
输出命令行参数的数量echo $#
输出脚本命令本身echo $0
输出第一个命令行参数echo $1
输出最后一个命令行参数eval echo ${$#}
输出全部命令行参数(不含命令本身)echo $@

⭐关系比较

输出 a 小于 b、a 不等于 b、a 大于等于b 的三种关系比较结果(同C语言)

read a b
echo $((a+b)) $((a-b)) $((a*b)) $((a/b)) $((a%b)) $((a**b))
echo $((a<b)) $((a!=b)) $((a>=b))
echo $((!a)) $((a&&b)) $((a||b))
if [ $a -lt $b ]; then
    echo $a $b
fi
if [ $a -gt $b ]; then
    echo $b $a
fi
echo $((~a)) $((a&b)) $((a|b)) $((a^b))
echo $((a<<b)) $((a>>b))

 ⭐⭐常用环境变量

基础环境变量示例:
printf "$USER='%s'\n" "$USER"
printf "$PWD='%s'\n" "$PWD"
printf "$HOME='%s'\n" "$HOME"
printf "$LANG='%s'\n" "$LANG"
printf "$PS1='%s'\n" "$PS1" # 主提示符
printf "$PATH='%s'\n" "$PATH"
# LOGNAME 登录用户名

其他常用内置变量:
$BASHBash的完整路径,例如 /bin/bash
$BASH_VERSIONBash的版本号
$ENV在某些shell中(如POSIX sh)指定环境文件,但在Bash中不常用
$PATH可执行文件的搜索路径,以冒号分隔
$HOME当前用户的主目录
$USER$LOGNAME当前用户名
$PWD当前工作目录
$OLDPWD上一个工作目录
$SHELL当前使用的Shell路径
$RANDOM每次引用时返回一个0到32767之间的随机整数
$LINENO当前执行的脚本行号
$UID当前用户的真实用户ID

 ⭐真题示例

1. 环境变量处理

题目:编写一个脚本,接收一个环境变量名作为参数,输出该环境变量的值。如果该变量未定义,则输出"UNDEFINED"。

name=$1
eval out=${$#}name}

if [ -n "$out" ]; then
    echo "$out"
else
    echo "UNDEFINED"
fi

2. 计算多个数字的总和

题目:编写脚本接收多个数字作为参数,计算它们的总和并输出。

错误示例:
sum=0
for((i=1;i<=$#;i++));do
    eval sum=$((sum+$i))
done
echo sum

正确示例:
sum=0
for num in "$@"; do
    sum=$((sum + num))
done
echo $sum

3. 判断是否为数字

if [[ $value =~ ^-?[0-9]+$ ]]; then
    echo "是数字"
fi

正则表达式解析:
  • ^ - 匹配字符串的开始位置
  • -? - 可选的负号
  • [0-9] - 匹配一个数字字符
  • + - 匹配前面的元素一次或多次
  • $ - 匹配字符串的结束位置

4. 判断文件类型

filename="$1"
if echo "$filename" | grep -q '.txt$'; then # 正则中 . 要防止转义,并且-q是判断是否找到表达式的
    echo "TXT文件"
fi

5. 判断星期几

day=$(date +%u)
case $day in
    1) echo "星期一" ;;
    2) echo "星期二" ;;
    3) echo "星期三" ;;
    4) echo "星期四" ;;
    5) echo "星期五" ;;
    6) echo "星期六" ;;
    7) echo "星期日" ;;
esac

6. 检查文件是否存在

方法一:
if [ -e "$name" ]; then
    echo "文件存在: $name"
    ls -la "$name"
else
    echo "文件不存在: $name"
fi

方法二:
name="$1"
cnt=$(find . -name "$name" | wc -l)
if [[ $cnt -eq 0 ]]; then
    echo "NO"
else
    echo "文件找到,共 $cnt 个匹配:"
    find . -name "$name" -exec ls -la {} \;
fi

 杂七杂八的东西

花括号扩展echo {a,z} > txt2
随机数$RANDOM - 返回0-32767之间的随机整数
重启rebootshutdown -r
关机shutdownpoweroff
查看命令历史history
查看文件类型file filename
查看绝对路径which command
系统运行时间uptime
查看内核版本uname -r
虚拟终端Ctrl+Alt+F1 至 Ctrl+Alt+F6(共6个)

⭐Linux 与 GNU 的关系
GNU 项目(1984年由理查德·斯托曼发起)旨在创建一个完全自由的操作系统(GNU 系统),以替代专有的 UNIX。
它提供了操作系统的核心工具:编译器(GCC)、编辑器(Emacs)、C 库(glibc)、Shell(Bash)等,但缺乏关键的内核

Linux 内核(1991年由林纳斯·托瓦兹发布)恰好填补了这一空白。当 Linux 与 GNU 工具结合后,形成了完整的操作系统,即 GNU/Linux 系统(俗称"Linux 发行版")。

Linux内核 只是一个核心程序,运行后你只能看到一个黑屏终端或内核日志。它本身无法提供完整的用户体验。

功能:
- 管理程序的运行,为程序分配资源,并且处理程序之间的通信
- 管理对文件系统的读写,把对文件系统的操作映射成对磁盘或其它块设备的操作
- 管理存储器,为程序分配内存,并且管理虚拟内存
- 管理输入、输出,将设备映射成设备文件
- 管理网络
Linux操作系统
(GNU/Linux 发行版)
内核 + 一系列外围软件的完整集合包。

- 内核:如上所述,是核心
- GNU工具:由GNU项目提供的Shell(如Bash)、编译器、基础命令(如 ls, cp)等,构成了用户与内核交互的命令行环境
- 软件包管理系统:如APT(Debian/Ubuntu)、YUM/DNF(RHEL/Fedora),用于安装和管理软件
- 桌面环境:如GNOME、KDE,提供图形用户界面(GUI)
- 其他应用软件:浏览器、办公软件等

Linux 发行版

Linux发行版众多,主要根据其技术基础、目标用户和适用场景进行分类:

  • 基于Debian:Ubuntu、Linux Mint
  • 基于Red Hat:Fedora、CentOS
  • 高度可定制:Arch Linux

⭐⭐find 命令详解

查找名为"config"的文件:find / -name "config" 2>/dev/null
2>/dev/null抛弃错误信息,/表示从根目录查找)

# 在当前目录及子目录中查找
find . -name "config"

# 查找名为config的文件或目录
find / -type f -name "config" 2>/dev/null # 只找文件
find / -type d -name "config" 2>/dev/null # 只找目录
find / -name ".*config*" 2>/dev/null # 查找隐藏的config文件

# 查找以config开头/结尾/包含的文件
find / -name "config*" 2>/dev/null # 以config开头
find / -name "*config" 2>/dev/null # 以config结尾
find / -name "*config*" 2>/dev/null # 包含config

# locate 快速查找
locate -b '\config' # 完全匹配"config"
locate -b '\config$' # 以"config"结尾

时间与日期
设置当前时间为2023年12月25日10:30date 122510302023sudo date -s "2023-12-25 10:30:00"
date命令格式说明格式:MMDDhhmm[[CC]YY][.ss],分别代表月、日、时、分、年、秒

tar 命令
解压tar.gz文件tar -xzf file.tar.gz
将所有.txt文件打包成archive.tartar -cvf archive.tar *.txt

⭐重定向操作符
>覆盖重定向(覆盖输出到文件)
>>追加重定向(追加输出到文件)
2>错误重定向
&>所有输出重定向

Shell 脚本

shebang行:shell脚本开头,指定使用某个解释器,如 #!/bin/bash,保证兼容性

示例:批量重命名当前目录下所有.txt文件为.bak
#!/bin/bash
for file in *.txt; do
    mv "$file" "${file%.txt}.bak"
done

示例:查找并删除7天前的.log文件
find /path/to/logs -name "*.log" -mtime +7 | xargs rm

循环计算示例

计算1到100的和

错误示例:
i=1
sum=0
while [ i -lt 101 ]; do
    sum=${sum}+${i}
    i++
done

正确示例:

方法一:while 循环
i=1
sum=0
while [ $i -lt 101 ]; do
    sum=$((sum + i))
    i=$((i + 1)) # 或 let i++ 或 ((i++))
done
echo $sum

方法二:C风格for循环
sum=0
for ((i=1; i<=100; i++)); do
    sum=$((sum + i))
done
echo $sum

方法三:范围for循环
sum=0
for i in {1..100}; do
    sum=$((sum + i))
done
echo $sum

示例:简单计算器
read -p "first num: " num1
read -p "operation: " op
read -p "second num: " num2
result=$((num1 $op num2))
echo "res: $result"

nohup 命令详解
nohup ./server > server.log 2>&1 &

解释:
- nohup:忽略挂起信号
- >:重定向标准输出
- 2>&1:将错误输出重定向到标准输出
- &:在后台运行

Bash 位置参数
$0脚本名称
$1, $2, $3...第1、2、3...个参数
$#参数个数
$@所有参数列表(每个参数是独立的字符串)
$*所有参数列表(所有参数合并为一个字符串)
$$当前脚本进程ID
$?上条命令的退出状态

find -exec 选项

find [路径] [表达式] -exec 命令 {} \;find [路径] [表达式] -exec 命令 {} +

示例:
# 查找并复制所有包含error的日志文件
find /var/log/ -name "*error*" -type f -exec cp {} /tmp/errors/ \;

# 查找并处理.cpp文件
ls | grep ".cpp" | xargs file
find . -name "*.cpp" -exec file {} \;

占位符说明:
  • {} - 占位符,替换为 find 找到的文件目录
  • \; - 表示命令结束
  • 避免报错可改成:find /var/log/ -name "*error*" -exec cp {} /tmp/errors/ \; 2>/dev/null

find 常用选项:
-name文件名
-user用户名
-group组名
-type目标类型:b、d、f、l(块设备、目录、文件、符号链接)
-size文件大小,如 -size +2000(200 block,512字节x200,约1MB)
-mtime修改时间,如7天内 -mtime -7

⭐实用技巧
统计/var/log目录下所有.log文件数量find /var/log -name "*.log" | wc -l
列出当前目录所有符号链接文件ls -la | grep '^l'
echo *.txt 的输出(有a.txt和b.txt)a.txt b.txt(通配符扩展)

date 命令格式说明
%Y四位年份(如 2025)
%y两位年份(如 25)
%m月份(01–12)
%b月份缩写(Dec)
%d日期(01–31)
%a星期缩写(Thu)
%u星期几(1-7, 1=周一)
%H小时(00–23)
%I小时(01-12)
%M分钟(00–59)
%S秒(00–59)

⭐操作系统概念
操作系统是管理和控制硬件的系统软件,它直接操作硬件,并向上层提供统一的资源管理接口。操作系统将硬件细节抽象化,负责进程调度、内存管理、文件系统等核心功能。

分层结构:
- 硬件:底层物理支撑
- 操作系统:中间层,管理硬件并为应用软件提供运行环境
- 应用软件:顶层,通过操作系统间接使用硬件资源

用户通过应用软件与计算机交互,应用软件依赖操作系统,操作系统驱动硬件。这种分层结构使得应用开发无需关心硬件细节,提高了系统的安全性和可移植性。

 补充:来自Linux实验手册

常用快捷键
Ctrl-C结束进程
Ctrl-D(EOF)退出terminal,等同于 exit + Enter
Ctrl-S中断控制台输出
Ctrl-Q恢复控制台输出
Ctrl-Z挂起进程 + fg 解锁
Ctrl-L清屏
Ctrl-U从光标处删除文本直到行首
Ctrl-K从光标处删除文本直到行尾
Ctrl-Y粘贴文本(粘贴删除的文本)
Ctrl-E将光标移动到行尾
Ctrl-A将光标移动到行的开头




© 2026 Sheng OovLeí
[ 支持中国公益项目 ]