菜单
▪ 首页
▪ 我的Blog
▪ 有趣线上小巧思
联系我
▪ Github
▪ 博客园
▪ 邮箱
▪ Bilibili
▪ QQ - 请备注(⁎˃ᆺ˂)
|
Blog - [山大][软院][2025级]Linux期末复习大纲
写在前面:本文几乎全部内容来自于对学长学姐遗留笔记的整理,在此感谢各位学长学姐的精心整理与无私馈赠!本文只是从我个人的视角对其进行了更细致的分类整理、通过自己实验命令补充等等。
本文仅供参考啊,我尽可能把能搜寻到的,不超纲很厉害的内容整理进来,当然一定会有遗漏错误,如果大家发现错误遗漏,非常感谢能够联系我 (๑˃̵ᴗ˂̵)!
|
写在后面:考完出成绩了,刚过A+线,排名啥不是很高,本来不是很想把这个内容再次细细整理、添加编辑发出来,但是感觉也能为大家提供复习的一点点便利。
毕竟几个压缩包里面多个文档反复提取去重还是有些麻烦(没有任何不好的意思!还是要感谢各位学长学姐的细心整理(๑╹ ╹)),
所以又在里面添加了一些我们这届考试时这上面没有的一些内容,重新分类了一下,标记了一下重点,使用AI将原markdown改成了HTML,做了一些美化(当然依旧支持 HTML3.2)。
顺便在这里不是很有资格地简单评价一下:
- 老师会狠捞,不用太过担心
- 往届学长学姐都说 PPT 中会有原题,但我们这届貌似没有这么幸运。。。大家还是要以知识掌握为主啊!况且Linux在开发,乃至作为生活主力机都是很舒服的存在,加油学啊!
- 其实Linux这个东东还是要在实际使用中学啊。当时候整理这查找那,写了这么多,一考试也是抛之于九霄云外了...现在把 Linux 当作了主力系统,花了功夫细学并用一个多月的 nvim,才感到能够参加考试了罢
|
用⭐来标记重点内容(“重点”判断是基于考频,主观性较强,大家谨慎参考哦)
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 | 可变目录,用于存放变动比较频繁的文件;如:系统日志 |
/root | root用户主目录 |
/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++) |
/bin | Linux命令,如 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/用户名,可用 ~ 代表主目录 |
(Change Directory)
基础用法:
cd path - 跳转到指定路径(可以是绝对路径或相对路径)
cd ~ 或 cd - 返回当前用户的主目录(home目录)
cd .. - 返回上一级目录
cd - - 返回上一次所在的目录
cd / - 跳转到根目录
示例:
cd /home/user/documents # 跳转到documents目录(绝对路径)
cd ../ # 返回上一级目录(相对路径)
cd ~/Desktop # 跳转到桌面目录
cd - # 返回上一次所在的目录
|
基础用法:
env - 显示所有环境变量
env | grep VAR - 查找特定环境变量
env VAR=value command - 临时设置环境变量并执行命令
示例:
env # 显示所有环境变量
env | grep PATH # 查找PATH环境变量
env LANG=C ls # 临时设置语言为英文并执行ls命令
|
(Print Working Directory)
使用命令 pwd 可以显示当前工作目录。可以在任何时候使用pwd命令来判断你所在文件系统中的位置。
基础用法:
pwd - 显示当前工作目录的完整路径
pwd -P - 显示物理路径(不包含符号链接)
示例:
pwd # 输出:/home/user/documents
cd /etc && pwd # 输出:/etc
cd - && pwd # 返回并输出:/home/user/documents
|
(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 | 字符设备文件 |
三位为一组,每组分别代表文件属主、同组用户和其他用户
(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)
|
(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 # 重命名目录
|
(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} # 同时创建两个目录
|
(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 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
|
(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 src dst |
原文件名和链接文件名都指向相同的物理位址inode
- 硬链接主要是增加一个文件的链接数,只要该文件的链接数不为 0,该文件就不会被物理删除
- 如果删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了原有的内容
- 不允许对目录建立硬链接(软链接可以)
- 硬链接不能跨越文件系统(不能跨越不同的分区)
|
符号链接(软链接)
ln -s src dst |
符号链接由于存放的是源文件的路径名,因而如果删除符号链接文件的源文件,符号链接文件将无法找到原有资料
|
| 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 |
显示当前用户名
|
(Change Mode)
权限表示:
| u (user) | 文件所有者 |
| g (group) | 同组用户 |
| o (others) | 其他用户 |
| a (all) | 所有用户(ugo的总和) |
权限类型:
| r (read) | 读权限 = 4 |
| w (write) | 写权限 = 2 |
| x (execute) | 执行权限 = 1 |
常用权限值:
777 | rwxrwxrwx(所有用户完全权限,不安全) |
755 | rwxr-xr-x(所有者完全权限,其他用户只读执行) |
644 | rw-r--r--(所有者读写,其他用户只读) |
600 | rw-------(只有所有者可读写) |
基础用法:
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 (Switch User) |
切换用户
su 仅仅取得root权限,工作环境不变
su - USERNAME - 完整切换用户环境
|
| sudo (SuperUser DO) |
提权
sudo 是完全取得root的权限和root的工作环境
sudo -u USERNAME COMMAND - 以指定用户身份执行命令
|
(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 用于列出当前进程清单。它显示的进程列表是一个静态列表,也就是说,这个列表是在我们启动这个命令时正在运行的进程的快照。
常用选项:
d delay - 指定更新的时间间隔(delay),以秒计算
n - 指定更新的次数,到达指定次数后将会退出top
常用选项:
-l - 显示后台任务的进程号与信息
-p - 只显示后台任务的 PID
-n - 显示上次通知用户后,执行状态有更动的后台任务状态
-r - 显示执行中的后台任务
-s - 显示暂停执行的后台任务
语法:
kill [-option] [signal] {PID | %job ID}
参数说明:
signal - 信号,与-s配合使用。不指定则送出信号 15 (TERM)
pid - 要终止的进程号
job ID - 要终止的进程对应的后台任务编号
-s - 指定需要送出的信号,既可以是信号名也可以是对应数字
如 kill %1 自动使用信号"TERMINATE",终结的是 JobID=1
用户退出系统时,一般来说会结束该用户的所有正在运行的程序。如果某些后台程序没有执行完,可以使用 nohup。
格式:
nohup {command|script} &
参数说明:
command - 命令
script - 程序或脚本
{a|b} - a和b中必选一项
示例:
题目:将程序 server 放到后台运行,并使其在关闭终端后仍继续运行。
答案:nohup server &
|
(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 # 统计当前目录下的文件/目录数量
|
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(包括文本共有多少行、文件名以及目前光标停在多少行)
(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 file 或 less +F file(类似tail -f)
操作键:
- 空格/PageDown:向下翻页
- PageUp/b:向上翻页
- ↑/↓:上下滚动一行
- /pattern:向下搜索pattern
- ?pattern:向上搜索pattern
- n:下一个搜索结果
- N:上一个搜索结果
- q:退出
more只能向下翻页,less支持上下翻页和搜索,功能更强大
|
(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中执行命令 |
$() | 执行括号内的命令,用输出结果替代整个表达式 |
$(()) | 算数扩展,等同于 $[] |
示例:
# () : 命令分组
(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?"等塞到引号里面的都不行(不会进行通配符扩展)
|
把一个命令在屏幕上的输出传递给另一个命令作为输入。用竖杠 | 表示。
一般形式:
命令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 可以将错误输出也通过管道传递
- 管道中的每个命令都在独立的子进程中执行
命令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 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 []
do
# 命令
done
# 或者是(如果和 do 写在一行要加上 ;)
until []; do
# 命令
done
|
./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 登录用户名
|
其他常用内置变量:
$BASH | Bash的完整路径,例如 /bin/bash |
$BASH_VERSION | Bash的版本号 |
$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之间的随机整数 |
| 重启 | reboot、shutdown -r |
| 关机 | shutdown、poweroff |
| 查看命令历史 | 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:30 | date 122510302023 或 sudo date -s "2023-12-25 10:30:00" |
| date命令格式说明 | 格式:MMDDhhmm[[CC]YY][.ss],分别代表月、日、时、分、年、秒 |
tar 命令
| 解压tar.gz文件 | tar -xzf file.tar.gz |
| 将所有.txt文件打包成archive.tar | tar -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) |
⭐操作系统概念
操作系统是管理和控制硬件的系统软件,它直接操作硬件,并向上层提供统一的资源管理接口。操作系统将硬件细节抽象化,负责进程调度、内存管理、文件系统等核心功能。
分层结构:
- 硬件:底层物理支撑
- 操作系统:中间层,管理硬件并为应用软件提供运行环境
- 应用软件:顶层,通过操作系统间接使用硬件资源
用户通过应用软件与计算机交互,应用软件依赖操作系统,操作系统驱动硬件。这种分层结构使得应用开发无需关心硬件细节,提高了系统的安全性和可移植性。
|
常用快捷键
| 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 | 将光标移动到行的开头 |
|