跳转到内容

Linux

一、Linux 概述

1.1 什么是 Linux

Linux 是一个开源的类 Unix 操作系统内核,由 Linus Torvalds 于 1991 年首次发布。基于 Linux 内核的发行版有 CentOS、Ubuntu、Debian、Rocky Linux、AlmaLinux 等。

1.2 Linux 系统架构

应用程序(Shell / GUI / 服务)
        │
    ┌───┴───┐
    │  Shell │  ← bash / zsh / fish
    └───┬───┘
        │
    ┌───┴───┐
    │  内核  │  ← 进程管理 / 内存管理 / 文件系统 / 网络 / 设备驱动
    └───┬───┘
        │
    ┌───┴───┐
    │  硬件  │
    └───────┘

1.3 常用发行版

发行版

包管理器

适用场景

Ubuntu / Debian

apt / dpkg

开发环境、个人服务器

CentOS Stream / Rocky Linux

dnf / yum

企业级服务器

Alpine

apk

Docker 容器

Arch Linux

pacman

极客/桌面


二、文件与目录操作

2.1 ls — 列出目录内容

# 基本用法
ls                     # 列出当前目录文件和目录(不含隐藏文件)

# 常用选项
ls -l                  # 长格式,显示权限、所有者、大小、修改时间
ls -a                  # 显示所有文件(包括 . 开头的隐藏文件)
ls -la                 # 组合:长格式 + 所有文件
ls -lh                 # 人类可读的文件大小(K、M、G)
ls -ltr                # 按时间排序(最新在最后)
ls -R                  # 递归显示子目录
ls -i                  # 显示 inode 号
ls -lS                 # 按文件大小排序

ls -l 输出解读:

-rw-r--r-- 1 root root 1024 May 20 10:30 file.txt
│        │ │    │    │    │           └── 文件名
│        │ │    │    │    └── 修改时间
│        │ │    │    └── 文件大小(字节)
│        │ │    └── 所属组
│        │ └── 所有者
│        └── 硬链接数
└── 文件类型和权限
    - 普通文件  d 目录  l 符号链接

2.2 cd — 切换目录

cd /path/to/dir        # 切换到指定目录
cd                     # 回到 home 目录
cd ~                   # 同上
cd -                   # 回到上一次所在目录
cd ..                  # 回到上级目录
cd ../..               # 回到上两级目录
cd /                   # 切换到根目录

2.3 pwd — 显示当前路径

pwd                    # 显示当前工作目录的完整路径
pwd -P                 # 显示物理路径(解析符号链接)

2.4 mkdir — 创建目录

mkdir dirname          # 创建单个目录
mkdir dir1 dir2 dir3   # 同时创建多个目录
mkdir -p a/b/c/d       # 递归创建嵌套目录(父目录不存在时自动创建)
mkdir -m 755 newdir    # 创建时指定权限

2.5 touch — 创建文件或更新时间戳

touch file.txt         # 创建空文件(文件不存在时)
touch file1.txt file2.txt  # 同时创建多个文件
touch -t 202405201030 file.txt   # 设置指定时间戳

2.6 cp — 复制文件或目录

cp source.txt dest.txt              # 复制并重命名
cp file.txt /path/to/dir/           # 复制到目录(保留原名)
cp file1.txt file2.txt /target/     # 同时复制多个文件

# 常用选项
cp -r dir1 dir2                     # 递归复制目录
cp -i file.txt /target/             # 覆盖前询问
cp -u source.txt dest.txt           # 仅当源文件更新时才复制
cp -p file.txt /target/             # 保留权限、时间戳等属性
cp -a dir1 dir2                     # 归档复制(保留所有属性和符号链接)
cp -v file.txt /target/             # 显示复制过程

2.7 mv — 移动/重命名

# 重命名
mv oldname.txt newname.txt

# 移动文件到目录
mv file.txt /target/dir/

# 多个文件
mv file1.txt file2.txt /target/dir/

# 常用选项
mv -i file.txt /target/             # 覆盖前询问
mv -u file.txt /target/             # 仅当源文件更新时才移动
mv -v file.txt /target/             # 显示过程

2.8 rm — 删除文件或目录

rm file.txt                          # 删除文件
rm file1.txt file2.txt              # 同时删除多个文件
rm -r dirname/                      # 递归删除目录及其内容
rm -rf dirname/                     # 强制递归删除(危险!需谨慎使用)
rm -i file.txt                      # 删除前逐个确认
rm -v file.txt                      # 显示删除过程

警告:rm -rf / 会删除整个系统,绝大多数系统有保护,但依然极度危险!

2.9 cat — 查看/拼接文件内容

cat file.txt                         # 显示文件全部内容
cat file1.txt file2.txt             # 拼接多个文件输出
cat -n file.txt                     # 显示行号
cat -b file.txt                     # 对非空行显示行号
cat -s file.txt                     # 压缩连续的空行为一行

# 创建并写入文件
cat > newfile.txt << EOF
第一行内容
第二行内容
EOF

2.10 head / tail — 查看文件头/尾部

# head — 查看文件开头
head file.txt                        # 默认显示前 10 行
head -n 20 file.txt                  # 显示前 20 行
head -c 100 file.txt                 # 显示前 100 字节

# tail — 查看文件末尾
tail file.txt                        # 默认显示最后 10 行
tail -n 20 file.txt                  # 显示最后 20 行
tail -f file.txt                     # 实时跟踪文件追加内容(日志查看必备)
tail -F file.txt                     # 跟踪文件(文件被删除重建后自动重新跟踪)
tail -n +5 file.txt                  # 从第 5 行开始显示到末尾

2.11 more / less — 分页查看文件

# more — 简单分页(只能向前翻页)
more file.txt
# 操作:空格键翻页、Enter 翻行、q 退出

# less — 增强分页(推荐使用)
less file.txt
# 操作:上下箭头滚动、PageUp/PageDown翻页、/搜索、n下个匹配、q退出
less -N file.txt                     # 显示行号
less +F file.txt                     # 类似 tail -f 实时模式
less +/keyword file.txt             # 打开时定位到第一个匹配

2.12 ln — 创建链接

# 硬链接(同一文件多个入口,不能跨文件系统,不能链接目录)
ln target.txt linkname.txt

# 软链接(符号链接,类似 Windows 快捷方式)
ln -s /path/to/target linkname
ln -s /usr/local/nginx /opt/nginx

# 查看软链接指向
ls -l linkname
readlink -f linkname                 # 解析最终路径

三、文件权限管理

3.1 权限模型

  -   rwx   rwx   rwx
  │    │     │     │
  │    │     │     └── 其他用户权限 (other)
  │    │     └── 所属组权限 (group)
  │    └── 所有者权限 (owner)
  └── 类型(- 文件 / d 目录 / l 链接)

权限含义:
  r (read)    = 4   文件:可读取内容    目录:可列出内容
  w (write)   = 2   文件:可修改内容    目录:可创建/删除文件
  x (execute) = 1   文件:可执行       目录:可进入

3.2 chmod — 修改权限

# 数字模式(推荐)
chmod 755 script.sh             # rwxr-xr-x(常见目录/执行文件权限)
chmod 644 file.txt              # rw-r--r--(常见文件权限)
chmod 600 private.key           # rw-------(私密文件)
chmod 777 public/               # rwxrwxrwx(全开放,不推荐)

# 符号模式
chmod u+x script.sh             # owner 增加执行权限
chmod g-w file.txt              # group 移除写权限
chmod o-rwx file.txt            # other 移除所有权限
chmod a+r file.txt              # 所有用户增加读权限
chmod u=rwx,g=rx,o= script.sh   # 分别设置各角色权限

# 递归修改
chmod -R 755 dirname/

3.3 chown / chgrp — 修改所有者和组

chown user file.txt              # 修改文件所有者为 user
chown user:group file.txt        # 同时修改所有者和所属组
chown :group file.txt            # 仅修改所属组
chown -R user:group dirname/     # 递归修改

chgrp group file.txt             # 修改文件所属组
chgrp -R group dirname/          # 递归修改

四、用户和组管理

4.1 用户管理

# 创建用户
useradd username                            # 基本创建
useradd -m username                         # 创建 home 目录
useradd -m -s /bin/bash username            # 指定 shell
useradd -m -g groupname username            # 指定主组
useradd -m -G wheel,docker username         # 指定附加组

# 删除用户
userdel username                            # 删除用户(保留 home 目录)
userdel -r username                         # 删除用户及其 home 目录

# 设置/修改密码
passwd username                # 修改指定用户密码(root)
passwd                         # 修改当前用户密码
passwd -l username             # 锁定用户
passwd -u username             # 解锁用户

# 修改用户属性
usermod -L username             # 锁定用户
usermod -U username             # 解锁用户
usermod -aG docker username     # 追加到附加组(-a = append)
usermod -s /bin/zsh username    # 修改登录 shell

4.2 组管理

groupadd groupname              # 创建组
groupadd -g 2000 groupname      # 指定 GID
groupdel groupname              # 删除组

4.3 su / sudo — 切换用户

su - username                   # 切换到指定用户(加载其环境变量)
su -                            # 切换到 root
sudo command                    # 以 root 执行
sudo -u username command        # 以指定用户身份执行
sudo -i                         # 进入 root shell
sudo -l                         # 查看当前用户可执行的 sudo 命令

4.4 相关文件

/etc/passwd                     # 用户账号信息
/etc/shadow                     # 加密密码
/etc/group                      # 组信息
/etc/sudoers                    # sudo 权限配置(用 visudo 编辑)

五、进程管理

5.1 ps — 查看进程

ps                              # 显示当前 shell 下的进程
ps aux                          # 显示所有进程(BSD 风格,最常用)
ps -ef                          # 显示所有进程(Unix 风格)
ps -ef | grep nginx             # 查找特定进程
ps -u username                  # 显示指定用户的进程
ps -eo pid,comm,%cpu --sort=-%cpu | head   # 按 CPU 使用率排序

ps aux 各列含义:

含义

USER

进程所有者

PID

进程 ID

%CPU

CPU 使用率

%MEM

内存使用率

VSZ

虚拟内存大小(KB)

RSS

物理内存大小(KB)

STAT

进程状态(R运行/S睡眠/D不可中断/Z僵尸)

START

启动时间

TIME

累计 CPU 时间

COMMAND

命令

5.2 top / htop — 实时进程监控

top                              # 启动 top
# 交互命令(在 top 界面内):
# 1       — 显示每个 CPU 核心
# M       — 按内存使用率排序
# P       — 按 CPU 使用率排序
# k       — 输入 PID 杀掉进程
# q       — 退出

# 常用启动参数
top -u username                  # 显示指定用户进程
top -p 1234,5678                 # 监控指定 PID
top -d 2                         # 每 2 秒刷新一次

# htop(更友好的交互式 top,需额外安装)
htop

5.3 kill / killall — 终止进程

kill PID                         # 发送 TERM 信号(优雅终止)
kill -9 PID                      # 发送 KILL 信号(强制终止)
kill -HUP PID                    # 重新加载配置

# 常用信号
# SIGHUP  (1)  — 重新加载配置
# SIGINT  (2)  — 中断(Ctrl+C)
# SIGKILL (9)  — 强制终止
# SIGTERM (15) — 优雅终止(默认)

killall processname              # 按名称终止所有匹配进程
pkill nginx                      # 终止所有 nginx 进程
pkill -f "python app.py"         # 按完整命令匹配

5.4 后台任务管理

# nohup — 忽略挂断信号
nohup command &
nohup python app.py > app.log 2>&1 &

# & — 在后台运行
command &

# jobs — 查看后台任务
jobs -l                          # 显示 PID

# fg — 将后台任务调回前台
fg %1

# Ctrl+Z — 将前台任务暂停并放入后台
# bg — 将暂停的任务放到后台继续运行
bg %1

5.5 systemctl — 服务管理(systemd)

systemctl start nginx            # 启动服务
systemctl stop nginx             # 停止服务
systemctl restart nginx          # 重启服务
systemctl reload nginx           # 重载配置(不中断服务)
systemctl status nginx           # 查看服务状态
systemctl enable nginx           # 开机自启
systemctl disable nginx          # 禁止开机自启
systemctl list-units --type=service  # 列出所有服务
systemctl daemon-reload          # 重载 systemd 配置

# 查看日志
journalctl -u nginx              # 查看 nginx 日志
journalctl -u nginx -f           # 实时跟踪
journalctl -u nginx --since today  # 今日日志

六、文本处理

6.1 grep — 文本搜索

# 基本搜索
grep "keyword" file.txt                    # 在文件中搜索
grep "keyword" file1.txt file2.txt         # 多个文件
grep -r "keyword" /path/to/dir/            # 递归搜索目录

# 常用选项
grep -i "keyword" file.txt                 # 忽略大小写
grep -v "keyword" file.txt                 # 反向匹配(排除)
grep -n "keyword" file.txt                 # 显示行号
grep -c "keyword" file.txt                 # 统计匹配行数
grep -l "keyword" *.txt                    # 仅显示匹配的文件名
grep -A 3 "keyword" file.txt               # 显示匹配行及之后 3 行
grep -B 3 "keyword" file.txt               # 显示匹配行及之前 3 行
grep -C 3 "keyword" file.txt               # 显示匹配行及前后各 3 行
grep -w "word" file.txt                    # 精确匹配整个单词
grep -E "pattern1|pattern2" file.txt       # 扩展正则(多模式 OR)

# 管道结合(极常用)
ps aux | grep nginx
history | grep "docker"

6.2 find — 查找文件

# 按名称查找
find /path -name "*.log"                   # 查找 .log 文件
find /path -iname "*.LOG"                  # 忽略大小写
find /path -name "*.log" -o -name "*.txt"  # 或(-o)

# 按类型查找
find /path -type f                         # 文件
find /path -type d                         # 目录
find /path -type l                         # 符号链接

# 按大小查找
find /path -size +100M                     # 大于 100MB
find /path -size -10k                      # 小于 10KB

# 按时间查找
find /path -mtime -7                       # 7 天内修改过的文件
find /path -mtime +30                      # 30 天前修改的文件
find /path -mmin -60                       # 60 分钟内修改过的文件

# 按权限查找
find /path -perm 644                       # 精确匹配权限

# 对查找结果执行操作
find /path -name "*.log" -mtime +7 -delete    # 删除 7 天前的日志
find /path -name "*.txt" -exec ls -lh {} \;   # 对每个结果执行命令
find /path -name "*.log" -exec rm -f {} +     # 批量删除(+ 更快)

# 查找并排除
find /path -name "*.log" ! -path "*/exclude/*"

6.3 sed — 流编辑器

# 替换(最常用)
sed 's/old/new/' file.txt                  # 替换每行第一个匹配
sed 's/old/new/g' file.txt                 # 替换每行所有匹配
sed -i 's/old/new/g' file.txt              # 原地修改文件
sed -i.bak 's/old/new/g' file.txt          # 原地修改并备份原文件

# 删除行
sed '3d' file.txt                          # 删除第 3 行
sed '3,5d' file.txt                        # 删除第 3-5 行
sed '/pattern/d' file.txt                  # 删除匹配行
sed '/^$/d' file.txt                       # 删除空行

# 打印指定行
sed -n '5p' file.txt                       # 打印第 5 行
sed -n '5,10p' file.txt                    # 打印第 5-10 行

# 插入和追加
sed '3i\新行内容' file.txt                  # 在第 3 行前插入
sed '3a\新行内容' file.txt                  # 在第 3 行后追加

6.4 awk — 文本分析工具

# 打印指定列
awk '{print $1}' file.txt                  # 打印第 1 列
awk '{print $1, $3}' file.txt              # 打印第 1 和第 3 列
awk '{print $NF}' file.txt                 # 打印最后一列(NF = 列数)

# 按分隔符(-F)
awk -F':' '{print $1, $3}' /etc/passwd     # 以冒号分隔
awk -F',' '{print $2}' data.csv            # 以逗号分隔

# 条件过滤
awk '$3 > 100' file.txt                    # 第 3 列大于 100 的行
awk '$1 == "nginx"' file.txt               # 第 1 列等于 nginx 的行
awk '/pattern/' file.txt                   # 匹配正则的行

# 统计
awk '{sum+=$3} END {print sum}' file.txt   # 第 3 列求和
awk 'END {print NR}' file.txt              # 统计行数
awk '{count[$1]++} END {for(i in count) print i, count[i]}'  # 分组统计

# 实战:统计 Nginx 日志每个 IP 访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

6.5 sort / uniq — 排序与去重

# sort
sort file.txt                              # 升序排序
sort -r file.txt                           # 降序排序
sort -n file.txt                           # 按数值排序
sort -k 2 file.txt                         # 按第 2 列排序
sort -k 2 -n file.txt                      # 按第 2 列数值排序
sort -t ',' -k 2 data.csv                  # 指定分隔符
sort -u file.txt                           # 排序并去重

# uniq(通常先 sort)
sort file.txt | uniq                       # 去重
sort file.txt | uniq -c                    # 去重并统计出现次数
sort file.txt | uniq -d                    # 仅显示重复的行
sort file.txt | uniq -u                    # 仅显示不重复的行

6.6 wc / cut / tr / tee

# wc — 计数
wc -l file.txt                # 行数
wc -w file.txt                # 单词数
wc -c file.txt                # 字节数

# cut — 列提取
cut -d':' -f1 /etc/passwd                # 按分隔符提取列
cut -c1-10 file.txt                      # 提取每行第 1-10 个字符

# tr — 字符转换
echo "hello" | tr 'a-z' 'A-Z'            # 小写转大写
cat file.txt | tr -d '\r'                # 删除 Windows 换行符

# tee — 同时输出到终端和文件
command | tee output.txt                  # 覆盖写入
command | tee -a output.txt               # 追加写入
command 2>&1 | tee output.txt             # 同时捕获 stderr

七、压缩与归档

7.1 tar — 打包和解包

# 创建压缩包
tar -czf archive.tar.gz dirname/          # .tar.gz(gzip)
tar -cjf archive.tar.bz2 dirname/         # .tar.bz2(bzip2)
tar -cJf archive.tar.xz dirname/          # .tar.xz(xz,最高压缩)

# 解压缩
tar -xzf archive.tar.gz                   # 解压 .tar.gz
tar -xjf archive.tar.bz2                  # 解压 .tar.bz2
tar -xJf archive.tar.xz                   # 解压 .tar.xz
tar -xzf archive.tar.gz -C /target/dir/   # 解压到指定目录

# 查看压缩包内容(不解压)
tar -tzf archive.tar.gz

参数记忆法:

参数

含义

c

Create(创建)

x

eXtract(解压)

z

gZip / j = Bzip2 / J = Xz

f

File(指定文件名,放在最后)

v

Verbose(显示过程)

C

Change directory(指定目标目录)

7.2 gzip / zip

# gzip
gzip file.txt               # 压缩为 file.txt.gz
gzip -k file.txt            # 压缩但保留原文件
gzip -d file.txt.gz         # 解压
gzip -9 file.txt            # 最高压缩级别(1-9,默认 6)

# zip
zip -r archive.zip dirname/              # 压缩目录
unzip archive.zip                         # 解压
unzip archive.zip -d /target/dir/         # 解压到指定目录
unzip -l archive.zip                      # 查看压缩包内容

八、磁盘与存储

8.1 df — 查看磁盘空间

df                       # 查看所有挂载分区(以 KB 为单位)
df -h                    # 人类可读格式(K/M/G)
df -h /home              # 查看指定目录所在分区的用量
df -T                    # 显示文件系统类型
df -i                    # 查看 inode 使用情况

8.2 du — 查看目录/文件大小

du -sh dirname/          # 查看目录总大小
du -sh *                 # 查看当前目录下各项大小
du -sh * | sort -rh      # 排序查看
du -h --max-depth=1      # 查看一级子目录大小
du -h --max-depth=2      # 查看两级子目录大小

8.3 mount / lsblk

mount /dev/sdb1 /mnt/data                 # 挂载分区
mount                                     # 查看所有挂载
umount /mnt/data                          # 卸载
lsblk                                     # 列出所有块设备(树形结构)
lsblk -f                                  # 显示文件系统类型
fdisk -l                                  # 列出所有磁盘和分区信息

九、网络相关

9.1 ping — 测试网络连通性

ping example.com                         # 持续 ping(Ctrl+C 停止)
ping -c 4 example.com                    # 发送 4 次后停止
ping -i 0.5 example.com                  # 间隔 0.5 秒

# 诊断思路:
# 1. ping 127.0.0.1 — 测试 TCP/IP 协议栈
# 2. ping 本机 IP — 测试网卡
# 3. ping 网关 — 测试局域网
# 4. ping 外网 IP — 测试外网路由
# 5. ping 域名 — 测试 DNS 解析

9.2 curl — 网络请求工具

# GET 请求
curl https://api.example.com/data

# 显示响应头
curl -I https://example.com               # 仅响应头
curl -i https://example.com               # 响应头 + 响应体

# 显示详细信息
curl -v https://example.com

# POST 请求
curl -X POST https://api.example.com/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"123456"}'

# 下载文件
curl -O https://example.com/file.tar.gz           # 保存为原文件名
curl -o myfile.tar.gz https://example.com/file.tar.gz  # 另存为

# 认证
curl -u username:password https://api.example.com  # Basic Auth
curl -H "Authorization: Bearer token123" https://api.example.com  # Bearer Token

# 跟随重定向
curl -L https://example.com

9.3 wget — 文件下载

wget https://example.com/file.tar.gz             # 下载文件
wget -O custom.tar.gz https://example.com/file.tar.gz  # 指定文件名
wget -c https://example.com/file.tar.gz          # 断点续传
wget -b https://example.com/file.tar.gz          # 后台下载
wget --limit-rate=1m https://example.com/file    # 限速下载

9.4 netstat / ss — 网络连接状态

# netstat(传统工具)
netstat -tlnp                    # 查看监听端口(TCP)
netstat -ulnp                    # 查看监听端口(UDP)
netstat -anp | grep :80          # 查看 80 端口连接

# ss — 现代替代方案(更快,推荐)
ss -tlnp                         # 查看监听端口
ss -an                           # 查看所有连接
ss -s                            # 统计摘要
ss -tn state established         # 查看已建立的 TCP 连接
ss -tn state time-wait           # 查看 TIME_WAIT 连接

TCP 连接状态说明:

状态

说明

LISTEN

服务端等待连接

ESTABLISHED

已建立连接,正常通信中

TIME_WAIT

主动关闭方等待 2MSL

CLOSE_WAIT

被动关闭方等待应用层关闭

9.5 防火墙

# firewalld(推荐,更友好)
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload

# iptables(传统)
iptables -L -n
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

9.6 其他网络诊断

# DNS 查询
nslookup example.com
dig example.com +short

# 路由追踪
traceroute example.com
traceroute -n example.com            # 不解析主机名

# 端口测试
nc -zv example.com 80                # 测试端口是否开放

十、包管理

10.1 apt(Debian/Ubuntu)

apt update                           # 更新软件包索引
apt upgrade                          # 升级所有可升级的包
apt install package_name -y          # 安装
apt remove package_name              # 卸载(保留配置文件)
apt purge package_name               # 完全卸载
apt autoremove                       # 移除不再需要的依赖
apt search keyword                   # 搜索软件包
apt show package_name                # 查看包信息
apt list --installed                 # 查看已安装的包
dpkg -i package.deb                  # 安装 .deb 包

10.2 yum / dnf(RHEL/CentOS/Rocky)

# dnf(CentOS 8+, Fedora, Rocky,yum 的现代替代)
dnf install package_name -y          # 安装
dnf remove package_name              # 卸载
dnf update                           # 更新全部
dnf search keyword                   # 搜索
dnf history                          # 查看操作历史
dnf history undo 5                   # 撤销第 5 次操作

十一、Shell 脚本基础

11.1 变量

#!/bin/bash
# 定义变量(= 两边不能有空格)
name="world"
num=42

# 使用变量
echo "Hello, $name"
echo "Hello, ${name}"                # 推荐写法

# 特殊变量
echo "脚本名: $0"
echo "参数1: $1, 参数2: $2"
echo "参数个数: $#"
echo "上一条命令退出码: $?"
echo "当前进程 PID: $$"

# 命令替换
current_date=$(date +%Y-%m-%d)
echo "今天是 $current_date"

11.2 条件判断

# if 语句
if [ "$name" = "world" ]; then
  echo "Hello World"
elif [ "$name" = "linux" ]; then
  echo "Hello Linux"
else
  echo "Hello Stranger"
fi

# 常用判断条件
# [ -f file ]   文件存在且为普通文件
# [ -d dir ]    目录存在
# [ -e path ]   路径存在
# [ -z "$str" ] 字符串为空
# [ -n "$str" ] 字符串非空
# [ "$a" = "$b" ]  字符串相等
# [ $a -eq $b ] 整数相等
# [ $a -gt $b ] 整数大于

# 数值比较推荐双括号
if (( num > 10 )); then
  echo "大于 10"
fi

11.3 循环

# for 循环
for i in 1 2 3 4 5; do
  echo "Number: $i"
done

for file in *.txt; do
  echo "Processing $file"
done

# while 循环
count=0
while [ $count -lt 10 ]; do
  echo "Count: $count"
  ((count++))
done

# 读取文件每一行
while IFS= read -r line; do
  echo "$line"
done < file.txt

11.4 函数

function greet() {
  local name="$1"                    # local 限定作用域
  echo "Hello, $name"
}

greet "Alice"

# 返回值(只能是 0-255 的整数)
is_even() {
  if (( $1 % 2 == 0 )); then
    return 0                         # 成功
  else
    return 1                         # 失败
  fi
}

if is_even 4; then
  echo "是偶数"
fi

十二、系统信息与监控

12.1 系统信息查看

uname -a                            # 内核版本和系统信息
cat /etc/os-release                 # 发行版信息
hostnamectl                         # 主机名和系统信息
uptime                              # 运行时间和负载
who                                 # 当前登录用户
last                                # 登录历史记录
lscpu                               # CPU 信息
free -h                             # 内存使用概况

12.2 定时任务(crontab)

crontab -e                          # 编辑定时任务
crontab -l                          # 查看定时任务
crontab -r                          # 删除所有定时任务

# 格式:分 时 日 月 周 命令
# * * * * * command
# │ │ │ │ └── 星期(0-7,0和7都是周日)
# │ │ │ └── 月份(1-12)
# │ │ └── 日期(1-31)
# │ └── 小时(0-23)
# └── 分钟(0-59)

# 常用示例
0 2 * * * /opt/backup.sh                        # 每天凌晨 2 点备份
*/5 * * * * /opt/check.sh                       # 每 5 分钟执行
0 9-18 * * 1-5 /opt/monitor.sh                  # 工作日 9-18 点每小时整点
0 0 1 * * /opt/monthly.sh                       # 每月 1 号执行
@daily /opt/daily_task.sh                       # 每天一次
@reboot /opt/startup.sh                         # 开机自启

十三、Docker 部署 Nginx

13.1 Docker 基础命令

# 安装 Docker(Ubuntu)
apt update && apt install docker.io -y
systemctl start docker
systemctl enable docker

# 基础操作
docker pull nginx:latest                        # 拉取镜像
docker images                                   # 查看本地镜像
docker ps                                       # 查看运行中的容器
docker ps -a                                    # 查看所有容器
docker run -d --name web -p 80:80 nginx         # 运行容器
docker stop web                                 # 停止容器
docker start web                                # 启动容器
docker restart web                              # 重启容器
docker rm -f web                                # 强制删除容器
docker rmi nginx:latest                         # 删除镜像
docker logs -f web                              # 查看日志
docker exec -it web /bin/bash                   # 进入容器
docker cp web:/etc/nginx/nginx.conf ./          # 从容器复制文件
docker stats                                    # 实时查看容器资源使用

13.2 Nginx 反向代理配置

# nginx.conf
server {
    listen 80;
    server_name example.com;

    # 反向代理到后端服务
    location /api/ {
        proxy_pass http://backend:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时设置
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }

    # 静态文件
    location / {
        root /usr/share/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

13.3 Nginx 负载均衡配置

# 定义上游服务器组
upstream backend {
    # 默认算法:轮询(round-robin)
    server 192.168.1.10:8080 weight=5;
    server 192.168.1.11:8080 weight=3;
    server 192.168.1.12:8080 weight=2;
    server 192.168.1.13:8080 backup;     # 备用
}

# 其他负载均衡算法
# upstream backend {
#     least_conn;               # 最少连接
#     ip_hash;                  # IP 哈希(会话保持)
#     hash $request_uri;        # URL 哈希
# }

server {
    listen 80;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

        # 健康检查相关
        proxy_next_upstream error timeout http_500 http_502 http_503;
        proxy_next_upstream_tries 3;
    }

    # Nginx 状态监控
    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}

13.4 负载均衡算法对比

算法

指令

原理

适用场景

轮询(默认)

无需配置

按顺序依次分配

后端服务器性能一致

加权轮询

weight

按权重比例分配

服务器性能不均

最少连接

least_conn

发给连接数最少的服务器

长连接/WebSocket

IP 哈希

ip_hash

按客户端 IP 固定分配

需要会话保持

URL 哈希

hash

按 URL 固定分配

缓存友好

13.5 Docker Compose 部署

# docker-compose.yml
version: '3.8'

services:
  nginx:
    image: nginx:alpine
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./html:/usr/share/nginx/html
      - ./logs:/var/log/nginx
      - ./ssl:/etc/nginx/ssl:ro
    restart: unless-stopped
    networks:
      - web

  backend1:
    image: myapp:latest
    container_name: backend1
    expose:
      - "8080"
    restart: unless-stopped
    networks:
      - web

  backend2:
    image: myapp:latest
    container_name: backend2
    expose:
      - "8080"
    restart: unless-stopped
    networks:
      - web

networks:
  web:
    driver: bridge
# 启动
docker-compose up -d

# 查看状态
docker-compose ps

# 扩容后端服务
docker-compose up -d --scale backend=3

# 停止
docker-compose down

十四、常用快捷操作

快捷键

作用

Ctrl+C

终止当前命令

Ctrl+Z

暂停当前命令放入后台

Ctrl+D

退出终端 / EOF

Ctrl+L

清屏

Ctrl+A

光标移到行首

Ctrl+E

光标移到行尾

Ctrl+U

删除光标前的内容

Ctrl+K

删除光标后的内容

Ctrl+W

删除光标前一个单词

Ctrl+R

搜索历史命令

!!

执行上一条命令

!$

上一条命令的最后一个参数

Tab

自动补全