[Linux服务器] Linux操作系统学习笔记

210 0
Honkers 2026-8-7 20:25:55 来自手机 | 显示全部楼层 |阅读模式

目录

  • 第一章 初识Linux操作系统
    • 1.1 Linux的起源与发展
    • 1.2 Linux的七大特点
    • 1.3 Linux的应用领域
    • 1.4 虚拟机快照
    • 1.5 图形用户界面
    • 1.6 Shell终端与命令格式
  • 第二章 Linux常用命令工具
    • 2.1 用户和用户组管理
    • 2.2 文件系统与目录结构
    • 2.3 目录管理命令
    • 2.4 文件查找命令
    • 2.5 文件内容显示命令
    • 2.6 文件复制、移动与删除
    • 2.7 压缩解压命令
    • 2.8 权限管理
    • 2.9 软件管理
    • 2.10 进程管理
    • 2.11 服务管理
    • 2.12 网络管理命令
    • 2.13 帮助命令
    • 2.14 Vim编辑器
  • 第三章 Shell编程
    • 3.1 Shell脚本基础
    • 3.2 Shell变量
    • 3.3 输入与输出
    • 3.4 特殊符号
    • 3.5 数值运算
    • 3.6 条件判断与语句
    • 3.7 循环语句
    • 3.8 Shell函数
    • 3.9 Shell数组

第一章 初识Linux操作系统

1.1 Linux的起源与发展

Linux是一款免费且开源的类UNIX操作系统,支持多用户、多任务、多线程及多CPU。

关键人物与项目:

  • Linus Torvalds:芬兰学生,开发了 Linux 内核
  • GNU 项目:Richard Stallman 于 1983 年发起
  • GPL 协议:1989 年发布,核心是"反版权"——软件自由,可修改、发布,但必须公开源码

1.2 Linux的七大特点

序号特点说明
1完全免费开源免费,可自由获取和使用
2POSIX 兼容完全兼容 POSIX 1.0 标准
3多用户多任务支持多用户同时登录,多任务并行执行
4良好的界面提供图形界面和命令行界面
5强大的网络功能内置完善的网络协议栈
6安全稳定权限机制严格,系统稳定性高
7多平台支持支持 x86、ARM 等多种硬件架构

1.3 Linux的应用领域

  1. 服务器领域(最广泛)—— Web服务器、数据库服务器、云服务器等
  2. 嵌入式领域 —— 路由器、交换机、家电、智能设备等
  3. 个人桌面领域 —— Ubuntu、Fedora 等桌面发行版

1.4 虚拟机快照

为什么使用快照?
系统操作中可能出现意外情况(如误删应用、配置错误),快照可以快速恢复系统状态。

什么是快照?
对某一时间点的系统进行备份存档,出现问题时可快速恢复到该状态。

操作方法:
右键虚拟机 → 快照 → 拍摄快照(命名 + 描述)→ 需要时恢复到快照

1.5 图形用户界面

Linux 常用的图形用户界面有 KDEGNOME 两种,均基于 X Window 视窗系统实现。

  • KDE:功能丰富、自定义能力强
  • GNOME:现代、简洁(CentOS Stream 9 默认桌面)

图形界面由系统面板、主菜单、桌面三部分组成,操作习惯与 Windows 类似。

X Window 的组成(必考):

组成部分作用
X 服务器X Window 的核心,处理输入/输出信息并维护资源,接收键盘、鼠标输入并在屏幕显示
X 客户端提供完整的图形用户界面,负责与用户直接交互,将操作传输给 X 服务器处理
X 协议X 服务器与 X 客户端之间的通信协议

1.6 Shell终端与命令格式

在 Linux 中,用户通过 Shell 输入命令来实现功能。

命令基本格式:

  1. command [options] [arguments]
复制代码
  • command:命令名称
  • options:选项,定义命令的执行特性
  • arguments:参数,指定命令作用的对象

选项分类:

  • 短选项:使用 - 标识,可以组合使用(如 -la)
  • 长选项:使用 -- 标识,不可以组合使用(如 --help)

第二章 Linux常用命令工具

2.1 用户和用户组管理

2.1.1 用户类型

Linux 中每个用户都有唯一的用户标识 UID,是系统辨识用户的唯一标识。

用户类型UID 范围说明
root 用户0超级用户/系统管理员,拥有最高权限;一般不直接登录使用
系统用户1~499系统内建用户,用于系统管理,不能登录,又称虚拟用户
普通用户500~60000由 root 创建,可登录系统,只能操作有权限的文件和目录
2.1.2 用户组

用户组是具有相同特性的用户集合。系统为每个用户组分配唯一标识 GID

  • 一个用户可以同时属于多个用户组
  • 基本组:只有一个
  • 附加组:可以有多个

用户和用户组配置文件:

配置文件作用权限
/etc/passwd保存用户相关信息(除密码外)所有用户可查看
/etc/shadowpasswd 的影子文件,保存用户密码等敏感信息仅 root 可查看
/etc/login.defs用户默认配置文件,定义用户相关限定设置所有用户可查看
/etc/group保存用户组相关信息所有用户可查看
/etc/gshadow存放用户组加密密码、组管理员等信息仅 root 可查看
2.1.3 用户管理命令

(1)useradd — 添加用户

格式:useradd [选项] 用户名

选项说明
-d指定用户登录目录
-c指定账号的备注文字
-e指定账号的有效期限
-f缓冲天数,密码过期后在指定天数关闭账号
-g指定用户基本组
-G指定用户所属的附加用户组
-m自动建立用户的登录目录
-r创建系统账号
-s指定用户的登录 Shell
-u指定用户 ID;加 -o 选项可与其他用户重复

(2)passwd — 设置密码

格式:passwd [选项] 用户名

选项说明
-l锁定密码,锁定后密码失效,无法登录(新用户默认锁定)
-u解除密码锁定
-d删除密码,仅系统管理员可使用
-S列出密码相关信息,仅系统管理员可使用
-f强行执行

(3)usermod — 修改用户信息

格式:usermod [选项] 参数

选项说明
-c修改用户账号的备注信息
-d修改用户的登录目录
-e修改账号的有效期限
-f修改缓冲天数(密码过期后禁用账号的时间)
-g修改用户基本组
-G为用户添加附属组
-l修改用户账号名称
-L锁定用户密码,使密码失效
-s修改用户登录后使用的 Shell
-u修改用户 ID
-U解除密码锁定

(4)userdel — 删除用户

格式:userdel [选项] 用户名

选项说明
-f强制删除用户,即便该用户为当前用户
-r删除用户的同时,删除与用户相关的所有文件

用户临时禁用与恢复:

  1. # 禁用
  2. passwd -l itcast
  3. usermod -L itcast
  4. # 恢复
  5. passwd -u itcast
  6. usermod -U itcast
复制代码
2.1.4 用户组管理命令

(1)groups — 查看用户所属组

格式:groups 用户名

  1. [root@localhost ~]# groups itheima
  2. itheima : itheima
复制代码

(2)groupadd — 添加用户组

格式:groupadd [选项] 参数

选项说明
-g指定新建用户组的 GID
-r创建系统用户组,GID 取值范围 1~499
-o允许创建 GID 已存在的用户组

(3)groupmod — 修改用户组

格式:groupmod [选项] 用户组

选项说明
-g为用户组指定新的 GID
-n修改用户组的组名
-o允许创建 GID 已存在的用户组
2.1.5 用户切换命令

(1)su — 切换用户

格式:su [选项] 用户名

选项说明
-c执行完指定命令后,切换回原来的用户
-l切换用户的同时切换工作目录,环境变量也随之改变
-m, -p切换用户时,不改变环境变量
-s指定要执行的 Shell

三种切换场景:

  • 普通用户 → root:直接 su,需输入 root 密码
  • root → 普通用户:su 用户名,无需密码
  • 普通用户 → 普通用户:su 用户名,需输入目标用户密码

(2)sudo — 受限的权限提升

  • sudo 是受限的 su 命令,只有特定用户可以使用
  • 特定用户指被 root 添加到 /etc/sudoers 文件中的用户
  • 推荐使用 visudo 命令编辑该文件(防止语法错误、支持多用户锁)

sudoers 文件格式:

  1. 用户名 主机名称=(可切换的身份) 可执行的命令
复制代码

示例:

  1. root ALL=(ALL) ALL
复制代码
  • 用户名:设置权限的用户名,写入 sudoers 才能使用 sudo
  • 主机名称:决定用户可从哪些网络主机连接
  • 可切换的身份:可切换为哪些用户身份
  • 可执行的命令:可执行哪些命令,需使用绝对路径

2.2 文件系统与目录结构

2.2.1 Linux 文件系统

文件系统是 Linux 管理文件的系统软件及相关数据结构的统称。

UFS(UNIX File System)的四个组成部分:

  1. 引导块
  2. 超级块
  3. 索引节点表
  4. 数据块区

常用文件系统类型:

文件系统特点
ext3日志文件系统,系统故障时保护数据不丢失,自动修复
ext4ext3 改进版,支持 1EB 容量、无限子目录、批量分配 block(RHEL7/8 支持)
xfs默认文件系统,高性能日志、快速恢复、支持 18EB 容量

VFS(虚拟文件系统):抽象层,提供统一接口访问不同文件系统。

2.2.2 Linux 目录结构(FHS 标准)

Linux 采用树状目录结构,根目录 / 是唯一根。

常用目录作用(必背):

目录作用
/根目录
/etc配置文件目录
/bin普通用户可执行命令
/home用户主目录
/usr用户程序/库(占用空间最大)
/dev设备文件
/boot启动相关文件
/tmp临时文件
/proc内存映射(虚拟文件系统)
/opt附加应用程序软件包
/swap虚拟内存交换文件
2.2.3 路径
  • 绝对路径:从根目录 / 开始(如 /home/itheima/file.txt)
  • 相对路径:从当前目录开始

特殊符号:

  • .:当前目录
  • ..:上级目录
  • ~:用户主目录
  • -:用户上次所在目录
2.2.4 Linux 文件类型
标识符文件类型说明
-普通文件文本文件、数据文件、二进制程序等
d目录文件构成文件系统的树形结构
l链接文件符号链接/软链接
c字符设备文件按字符读写的设备(如终端)
b块设备文件按块读写的设备(如磁盘)
p管道文件进程间通信
sSocket 文件网络通信套接字

查看文件类型示例:

  1. [itheima@localhost ~]$ cd /etc
  2. [itheima@localhost etc]$ ls -l
  3. -rw-r--r--. 1 root root 16 7月 21 18:09 adjtime
  4. drwxr-xr-x. 3 root root 65 7月 21 18:04 alsa
  5. lrwxrwxrwx. 1 root root 10 5月 11 2019 rc0.d -> rc.d/rc0.d
复制代码

2.3 目录管理命令

命令作用
pwd显示当前工作目录的绝对路径
cd切换工作目录(无参数时切换到用户主目录)
ls列出目录或文件的属性信息
mkdir创建目录
rmdir删除空目录

ls 常用选项:

选项说明
-l以详细信息形式展示文件
-a显示全部文件(包括隐藏文件)
-d查看目录属性
-t按创建时间顺序列出文件
-i输出文件的 i-node 编号
-R递归显示所有子目录中的文件和子目录

mkdir 常用选项:

选项说明
-p若路径中的目录不存在,则先创建(递归创建)
-v查看文件创建过程

示例:

  1. # 递归创建多级目录
  2. [itheima@localhost ~]$ mkdir -pv a/b/c
  3. mkdir: 已创建目录 'a'
  4. mkdir: 已创建目录 'a/b'
  5. mkdir: 已创建目录 'a/b/c'
  6. # 递归删除空目录(子目录删除后上层也为空则一并删除)
  7. [itheima@localhost ~]$ rmdir -p itheima/itcast/a
复制代码

2.4 文件查找命令

2.4.1 find — 查找文件和目录

格式:find [路径] [选项] [查找条件]

  • 不指定路径时默认在当前路径查找
  • 逐级搜索子目录,找到符合条件的文件则输出路径

find 常用选项:

选项说明
-name根据文件名查找文件
-lname根据文件名查找符号链接文件
-size根据文件大小查找文件
-user根据文件所有者查找文件
-group根据用户组查找文件
-uid n查找 UID 为 n 的用户所有的文件
-gid n查找 GID 为 n 的用户组所有的文件
-empty查找大小为 0 的目录或文件
-type x查找类型为 x 的文件
-atime n查找 n 天以前访问过的文件

示例:

  1. [itheima@localhost ~]$ find /etc -name passwd
  2. /etc/pam.d/passwd
  3. /etc/passwd
复制代码
2.4.2 which — 搜索可执行文件位置
  1. [itheima@localhost ~]$ which ls
  2. alias ls='ls --color=auto'
  3. /usr/bin/ls
复制代码
2.4.3 whereis — 查找可执行文件和帮助文件

格式:whereis [选项] 命令

选项说明
-b只查找可执行文件的位置
-m只查找帮助文件

示例:

  1. [itheima@localhost ~]$ whereis -b ls # 查找可执行文件
  2. ls: /usr/bin/ls
  3. [itheima@localhost ~]$ whereis -m ls # 查找帮助文档
  4. ls: /usr/share/man/man1/ls.1.gz
复制代码

2.5 文件内容显示命令

命令作用
cat将文件内容打印到输出设备(适合小文件)
more分页显示文件内容(向下翻页)
less分页显示文件内容(支持上下翻页,功能更强)
head查看文件的前 n 行内容
tail显示文件的后 n 行内容
cat 常用选项
选项说明
-n打印内容时进行编号
-b与 -n 类似,但空白行不编号
-s连续两行以上空白行合并为一行
-E在每行结尾处显示 $ 符号
more 常用选项与快捷键
选项说明
+n从第 n 行开始显示
-n定义屏幕大小为 n 行
-c从顶部清屏后显示
-p通过清屏换页
-s连续多个空行显示为一行
-u去掉下画线
快捷键说明
f / Space显示下一页
Enter显示下一行
q / Q退出
less 常用选项与快捷键
选项说明
-e文件显示结束后自动退出
-i忽略搜索时的大小写
-m显示查看百分比
-N显示每行的行号
-s将连续空行显示为一行
快捷键说明
/字符串向下搜索字符串
?字符串向上搜索字符串
b / PageUp / ↑向上翻页
d / PageDown / ↓向下翻页
空格键向下翻页
q退出
head 常用选项
选项说明
-n显示的行数,默认显示 10 行
-v显示文件名

2.6 文件复制、移动与删除

2.6.1 cp — 文件复制

格式:cp [选项] 源文件/目录 目标文件/目录

功能:

  • 复制文件内容到另一个文件
  • 将文件复制到指定目录
  • 复制目录(需加 -R 选项递归复制)

cp 常用选项:

选项说明
-a递归复制,保留原有文件属性(如时间戳)
-R递归复制目录,使用新的文件属性
-p拷贝时不修改文件属性(所有者、所属组、权限、时间)
-f强行复制,覆盖原文件
-i覆盖前给出提示(与 -f 相反)
2.6.2 mv — 文件移动/重命名

格式:mv [选项] 文件/目录 目标文件/目录

两个功能:

  1. 重命名文件:相同路径下的两个文件
  2. 移动文件/目录:移动到指定目录

mv 常用选项:

选项说明
-f强制移动或重命名
-i移动或重命名前给出提示
2.6.3 rm — 文件删除

格式:rm [选项] 文件/目录

rm 常用选项:

选项说明
-f强制删除文件/目录
-rf递归删除指定目录中所有文件和子目录,不逐一确认
-i删除时逐一确认(y/n)

示例:

  1. # 复制文件
  2. [itheima@localhost ~]$ cp a.txt b.txt
  3. # 递归复制目录
  4. [itheima@localhost ~]$ cp -R dir itcast
  5. # 重命名
  6. [itheima@localhost ~]$ mv oldname.txt newname.txt
  7. # 强制删除目录及其所有内容
  8. [itheima@localhost ~]$ rm -rf dir
复制代码

2.7 压缩解压命令

2.7.1 gzip / gunzip
  • 压缩后生成 .gz 格式
  • 不保留原文件,多个文件分别压缩(不打包)
  • zcat:查看 .gz 压缩包内容

gzip 常用选项:

选项说明
-c输出到标准输出,保留原文件
-d解开压缩文件
-f强制压缩
-l列出压缩文件相关信息
-r递归压缩目录下所有文件
-v显示压缩比信息
2.7.2 bzip2 / bunzip2
  • 压缩后生成 .bz2 格式
  • 压缩效率高于 gzip
  • -k 选项可保留原文件
  • bzcat:查看 .bz2 压缩包内容

bzip2 常用选项:

选项说明
-d解压缩
-k保留原文件
-f强制压缩,覆盖原有压缩包
-v显示压缩文件详细信息
2.7.3 zip / unzip
  • 压缩后生成 .zip 格式
  • 保留原文件,多个文件压缩成一个压缩包

zip 常用选项:

选项说明
-j只保留文件名,不存放目录结构
-m压缩完成后删除原始文件
-r递归处理目录下所有文件和子目录

unzip 常用选项:

选项说明
-l显示压缩包中包含的文件
-n解压时不覆盖原有文件
-o直接覆盖原有文件
-d指定解压后文件存放的目录
2.7.4 tar — 打包归档

格式:tar [选项] 包名 文件/目录

  • 将多个文件/目录打包成 .tar 格式(打包后大小不变)
  • 通常与 gzip/bzip2 结合使用,生成 .tar.gz / .tar.bz2

tar 常用选项:

选项说明
-c创建新的备份文件
-f指定备份文件名(通常必选)
-x从备份文件中还原文件
-t列出备份文件内容
-v显示打包过程
-z打包后使用 gzip 压缩
-j打包后使用 bzip2 压缩
-p打包时保留文件原来的属性
-k还原时遇到同名文件不覆盖

常用组合:

  1. # 创建 tar 包
  2. tar -cvf usrbin.tar /usr/bin
  3. # 查看 tar 包内容
  4. tar -tf usrbin.tar
  5. # 还原 tar 包
  6. tar -xf usrbin.tar
  7. # 打包并 gzip 压缩
  8. tar -zcvf usrbin.tar.gz /usr/bin
  9. # 解压 tar.gz
  10. tar -zxvf usrbin.tar.gz
复制代码

2.8 权限管理

2.8.1 文件权限概述

用户对文件/目录的访问权限分为三种:读、写、执行

两种表示方式:字符表示法数字表示法

字符表示法:

权限字符对文件的作用对目录的作用
读权限r可查看文件内容可以列出目录中的内容
写权限w可修改文件内容可以在目录中创建、删除文件
执行权限x可执行该文件可以进入目录

数字表示法:

  • 用 3 位二进制数表示,有权限为 1,无权限为 0
  • 对应八进制数,最大为 7
权限组合二进制八进制
rwx1117
rw-1106
r-x1015
r–1004
-wx0113
-w-0102
–x0011
0000
2.8.2 chmod — 更改文件权限

格式:chmod [选项] 权限 文件/目录

  • 支持字符方式(rwx)和数字方式
  • 设置所有者权限时可省略用户(如 chmod +x file)

chmod 常用选项:

选项说明
-f不显示错误信息
-v显示指令执行过程
-R递归处理指定目录及其中所有文件与子目录

示例:

  1. # 数字方式设置权限
  2. [itheima@localhost ~]$ chmod 744 file
  3. [itheima@localhost ~]$ ls -l file
  4. -rwxr--r--. 1 itheima itheima 10 8月 19 15:36 file
  5. # 字符方式添加执行权限
  6. chmod u+x file # 所有者添加执行权限
  7. chmod g+w file # 所属组添加写权限
  8. chmod o-r file # 其他用户移除读权限
  9. chmod a+x file # 所有用户添加执行权限
复制代码

2.9 软件管理

2.9.1 RPM 包管理

RPM(Red Hat Package Manager)是 Red Hat 系列的软件包管理工具。

(1)安装软件包

格式:rpm [选项] RPM软件包

选项含义
-i安装指定的一个或多个软件包
-v显示安装过程
-h以 # 号显示安装进度
  1. [root@localhost ~]# rpm -ivh jdk-8u151-linux-x64.rpm
复制代码

(2)查询软件包

选项含义
-q查询软件包信息
-a查询已安装的包
-c显示软件包的配置文件列表
-d显示软件包的文本文件列表
-p查询软件包文件(通常与其他选项组合)
-l列出已安装软件包内所有文件
-f查询文件属于哪个软件包
-s列出软件包内所有文件状态
  1. # 查看 JDK 是否已安装
  2. [root@localhost ~]# rpm -qa | grep jdk
  3. jdk1.8-1.8.0_151-fcs.x86_64
  4. # 查询软件包中的文件
  5. [root@localhost ~]# rpm -qp jdk-8u151-linux-x64.rpm
复制代码

(3)升级软件包

选项含义
-U升级指定软件包(先移除旧版本,再安装新版本)
-v显示升级过程
-h以 # 号显示升级进度

(4)卸载软件包

  1. # 使用 -e 选项卸载
  2. [root@localhost ~]# rpm -e jdk1.8
复制代码

注意:RPM 无法处理软件包之间的依赖关系,存在依赖关系的软件一般不使用 RPM 管理。

2.9.2 DNF 包管理
  • YUM:Yellow dog Updater, Modified,高级软件包管理工具,可自动解决依赖关系
  • YUM 源:软件仓库,类似应用商店,维护软件包及依赖关系
  • DNF(Dandified YUM):YUM 的扩展版本,改进了性能和依赖解决,CentOS Stream 9 默认使用
  • yum 是 dnf 的软链接,两者可互换使用

dnf 基本格式:

  1. dnf [选项] 命令 软件名称
复制代码
选项含义
-h显示帮助信息
-y全部问题自动回答为 “yes”
-v详细模式

(1)安装软件

  1. [root@localhost ~]# dnf install telnet
复制代码

(2)查询软件

  • dnf list:列出软件仓库中的软件包
  • dnf info:显示软件包的详细信息

(3)更新软件

命令作用
dnf update 软件名称升级指定软件(已过时,逐渐被 upgrade 替代)
dnf upgrade 软件名称升级指定软件
dnf check-update 软件名称检查可以升级的 RPM 软件包
dnf groupupdate 用户组升级用户组里面的所有软件包

(4)卸载软件

  1. dnf remove 软件名称
复制代码

(5)清除缓存

  1. dnf clean all # 清除所有过期无用的缓存数据
复制代码

2.10 进程管理

2.10.1 ps — 查看进程状态

格式:ps [选项] [参数]

选项说明
-a显示除会话组长之外的所有进程
-e显示所有进程,包括系统进程
-f显示进程更多详细信息
-u以用户的形式显示进程信息
-x显示没有控制终端的进程
-l使用详细格式显示进程信息
--pid显示指定 PID 的进程信息

常用组合:

  1. # 显示所有用户的进程详细信息
  2. [itheima@localhost ~]$ ps -aux
  3. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  4. root 13 0.0 0.0 0 0 ? S 09:34 0:00 [cpuhp/0]
  5. itheima 2718 0.0 0.4 93992 7508 ? Ss 10:42 0:00 /usr/lib/system
复制代码
2.10.2 top — 动态显示进程状态

格式:top [选项] [参数]

  • 动态实时显示进程状态,默认每 3 秒刷新一次
  • 类似 Windows 任务管理器,是系统性能监测工具

top 常用选项:

选项说明
-b批处理方式显示进程信息
-d自定义刷新时间间隔
-i忽略空闲进程或僵死进程
-p监视指定的 PID 进程
-c显示进程命令行(包括路径)

top 输出前 5 行含义:

  1. 第 1 行:系统当前时间、运行时间、登录用户数、1/5/15 分钟平均负载
  2. 第 2 行:进程总数、运行中、睡眠中、终止、僵死进程数
  3. 第 3 行:CPU 资源使用情况
  4. 第 4 行:内存资源使用情况
  5. 第 5 行:swap 交换分区使用情况

top 交互快捷键:

快捷键说明
l控制是否显示平均负载和启动时间(第 1 行)
t切换进程统计和 CPU 状态显示模式(第 2、3 行)
m切换内存信息显示模式(第 4、5 行)
M按内存使用率排序
P按 CPU 使用率排序
T按进程运行时间排序
i忽略闲置和僵死的进程
q退出 top 命令
2.10.3 pstree — 树状显示进程
  • 以树状形式显示系统进程,直观展示进程间的派生关系
  • 初始化进程为 systemd,其他进程都有父进程
选项说明
-a显示每个进程的完整命令(路径、参数等)
-c不使用精简标识法
-h列出树状图,特别标明当前正在执行的进程
-u显示用户名称
-n使用程序识别码排序(默认按名称排序)
  1. [itheima@localhost ~]$ pstree -h
  2. systemd─┬─ModemManager───2*[{ModemManager}]
  3. ├─NetworkManager───2*[{NetworkManager}]
  4. ├─sshd───sshd───sshd───bash───pstree
  5. └─wpa_supplicant
复制代码
2.10.4 pgrep — 按服务名查找进程

根据服务名称查找相关进程,显示进程 PID。

选项说明
-o仅显示同名进程中 PID 最小的进程
-n仅显示同名进程中 PID 最大的进程
-p指定进程父进程的 PID
2.10.5 进程终止命令

(1)kill — 终止指定进程

  • 工作原理:向指定进程发送信号,改变进程状态
  • 格式:kill [信号] PID
  1. # 强制终止 PID 为 3794 的进程
  2. [itheima@localhost ~]$ kill -9 3794
复制代码

常用信号:

  • 1 (SIGHUP):挂起信号,重新加载配置
  • 9 (SIGKILL):强制终止,不可忽略
  • 15 (SIGTERM):正常终止(默认信号)

(2)killall — 按服务名终止所有进程

  • 终止某个服务对应的全部进程
  • 格式:killall [信号] 服务名称
  1. # 终止 nginx 服务的所有进程
  2. [root@localhost ~]# killall nginx
复制代码

2.11 服务管理

服务(守护进程 daemon):常驻内存的后台进程,持续运行提供功能,无需用户交互。

  • CentOS 7 之前:使用 service 和 chkconfig 命令
  • CentOS 7 及之后:使用 systemctl 命令统一管理

格式:

  1. systemctl 功能命令 服务进程
复制代码

systemctl 常用功能命令:

功能命令说明
start启动服务进程
stop终止服务进程
status查询服务进程运行情况
restart重启服务进程
enable设置服务开机自启动
disable取消服务开机自启动
reload重新加载配置文件(并非所有服务支持)

示例:

  1. [root@localhost ~]# systemctl start httpd # 开启 http 服务
  2. [root@localhost ~]# systemctl status httpd # 查询运行状态
  3. [root@localhost ~]# systemctl stop httpd # 终止 http 服务
复制代码

2.12 网络管理命令

2.12.1 ping — 测试网络连通性

ping 常用选项:

选项说明
-c设置回应次数(如 -c 4 表示回应 4 次)
-s设置数据包大小(如 -s 1024 表示每次发送 1024 字节)
-v显示命令详细的执行过程
2.12.2 ssh — 远程登录

格式:ssh 用户名@IP地址 [端口号]

  1. [itheima@localhost ~]$ ssh zhangsan@192.168.91.132
  2. zhangsan@192.168.91.132's password: # 输入密码
  3. Last login: Fri May 24 14:15:43 2024
  4. [zhangsan@localhost ~]$ # 登录成功
复制代码

远程操作完毕后,使用 exit 命令退出。

2.12.3 ip — 网络配置命令

格式:ip [选项] [参数] 命令 设备

ip 常用选项:

选项/命令说明
-s输出详细信息,可连续使用
-f强制使用指定的协议族
-4指定 IPv4 协议
-6指定 IPv6 协议
-r使用域名而非 IP 地址
show显示参数信息
add添加
del删除
up启动设备
down关闭设备

ip 常用设备参数:

参数说明
link链路信息
address协议地址(可简写为 addr 或 a)
route路由设备

示例:

  1. # 查看网卡地址
  2. [itheima@localhost ~]$ ip a
  3. # 查看本机邻居表信息
  4. [itheima@localhost ~]$ ip neigh
  5. 192.168.91.2 dev ens33 lladdr 00:50:56:e0:c0:9c STALE
复制代码

2.13 帮助命令

2.13.1 man — 帮助手册

格式:man 命令/函数/库名

操作快捷键:

  • ↑ ↓:上下移动
  • Page Up Page Down:上下翻页
  • 空格键:向下翻一页
  • Enter:向下移动一行
  • Q:退出

man 手册常见字段:

字段含义
NAME命令的简单说明
SYNOPSIS命令的语法格式或函数声明
DESCRIPTION命令的功能介绍
OPTIONS命令选项的详细介绍
EXAMPLES用法示例
SEE ALSO参考资料
2.13.2 info — 节点式帮助手册
  • 以节点形式呈现,结构化更高,更易于阅读

info 快捷键:

快捷键说明
n (next)下一个节点
p (previous)上一个节点
l (last)跳转到上一次浏览的节点
u (upper node)跳转到上层节点
d (directory node)到 info 手册的根节点
t (top node)跳转到当前手册的顶层节点
s (search)全文检索(也可用 / 搜索)
q (quit)退出

2.14 Vim 编辑器

Vim 是一个功能强大的全屏交互式文本编辑器。

2.14.1 基本操作
  • 启动:vim 文件名
  • 进入编辑:按 i 键进入编辑模式
  • 保存退出:末行模式下输入 :wq 后回车
  • 不保存退出:末行模式下输入 :q 后回车
2.14.2 三种工作模式

(1)命令模式

默认进入的模式,可控制光标移动、复制、粘贴、删除、查找等,无法手动输入编辑。

光标移动(6 个级别):

  • 字符级:h 左、j 下、k 上、l 右
  • 单词级:w 下一个单词、b 上一个单词
  • 行级:0 行首、$ 行尾
  • 段落级:{ 上一段、} 下一段
  • 屏幕级:H 屏幕顶部、M 屏幕中间、L 屏幕底部
  • 文档级:gg 文档开头、G 文档结尾

复制和粘贴:

快捷键含义
yy复制光标当前所在行
n+yy复制 n 行内容(包括光标所在行)
y+e从光标位置复制到当前单词结尾
y+$从光标位置复制到当前行结尾
y+{从段落开始复制到光标位置
p将复制的内容粘贴到光标所在位置

删除文本:

快捷键含义
x删除光标所在的单个字符
dd删除光标所在的当前行
n+dd删除包括光标所在行的后边 n 行内容
d+$删除光标位置到当前行尾的所有内容

其他操作:

快捷键含义
u撤销命令
.重复执行上一个命令
J合并两行内容
r+字符快速替换光标所在字符

(2)编辑模式(输入模式)

可正常输入、修改文件内容。从命令模式按以下快捷键进入:

快捷键含义
i光标定位到字符之前
I光标定位到本行行首
a光标定位到字符之后
A光标定位到本行行尾
o在本行下面新插入一行
O在本行上面新插入一行
s删除光标所在处的字符
S删除光标所在的整行文本

(3)末行模式

在文件最后一行输入命令完成操作,主要用于保存退出、设置环境等。

在命令模式按 : 进入末行模式。

命令含义
:q退出 Vim 编辑器
:wq保存并退出
:q!强制退出,不保存修改
:wq!强制保存并退出
:set nu设置行号(仅本次有效)
:set nonu取消行号
:n光标移动到第 n 行
:/字符串从上至下搜索字符串
:?字符串从下至上搜索字符串
:s/str1/str2当前行第一个 str1 替换为 str2
:s/str1/str2/g当前行所有 str1 替换为 str2
:%s/str1/str2/g全文替换
:%s/str1/str2/gc全文替换,每次替换都有提示

第三章 Shell编程

Shell 既是一种命令语言,又是一种程序设计语言(Shell 脚本)。

3.1 Shell脚本基础

Shell 脚本:将 Shell 命令、变量和控制语句等按照规则编写成的文本文件。执行时逐行分析解释。

3.1.1 脚本创建与执行

脚本基本结构:

  1. #!/bin/bash
  2. # 脚本注释
  3. echo "Hello Shell"
  4. exit 0
复制代码

两种执行方式:

  1. 直接执行:赋予执行权限后执行

    1. chmod +x script.sh
    2. ./script.sh
    复制代码
  2. 使用 sh 命令执行:无需执行权限

    1. sh script.sh
    复制代码

3.2 Shell变量

3.2.1 变量基础
  • 变量名由字母、数字、下划线组成,开头只能是字母或下划线
  • Shell 变量没有数据类型
  • 使用 $ 符号引用变量
  1. # 定义变量
  2. var="hello itheima"
  3. # 引用变量
  4. echo $var
  5. echo ${var}
复制代码
3.2.2 变量引用方式
引用格式返回值示例
$var返回变量值var="itheima" → $var = itheima
${var}返回变量值${var} = itheima
${#var}返回变量长度${#var} = 7
${var:start_index}从 start_index 开始到末尾的子串${var:2} = heima
${var:start:length}从 start 开始的 length 个字符${var:2:3} = hei
${var#string}从左边删除最短匹配(含 string)${var#*e} = imaitheima
${var##string}从左边删除最长匹配(含 string)${var##*e} = ima
${var:=newstring}变量为空则赋值并返回新值,否则返回原值var="" → ${var:=itheima} = itheima,且 var=itheima
${var:-newstring}变量为空则返回新值,不改变变量var="" → ${var:-itheima} = itheima,var 仍为空
${var:+newstring}变量为空返回空,否则返回新值var="itheima" → ${var:+hello} = hello
${var:?newstring}变量为空则写入标准错误,语句失败var="" → ${var:?itheima} 报错
${var/sub/new}替换第一个匹配的子串${var/ma/xy} = itheixy
${var//sub/new}替换所有匹配的子串${var//ma/xy} = itheixyitheixy
3.2.3 只读变量

使用 readonly 关键字设置只读变量:

  1. readonly len=10
  2. len=100 # 报错:-bash: len:只读变量
复制代码
3.2.4 清除变量

使用 unset 命令清除变量:

  1. name=zhangsan
  2. unset name
  3. echo $name # 无输出
复制代码
3.2.5 环境变量

系统定义的环境变量通常使用大写命名,如 PATH、HOME、SHELL 等。

使用 env 命令查看所有环境变量。

常见环境变量:

变量作用
PATH存储可执行文件的目录,多个目录用 : 分隔
HOME当前用户的家目录
SHELL当前使用的 Shell(CentOS Stream 9 默认为 bash)
PWD当前工作目录
OLDPWD上一个工作目录
PS1一级 Shell 提示符格式
PS2二级 Shell 提示符格式

PS1 提示符格式说明:

  • \u:当前用户名
  • \h:主机名
  • \W:当前目录名
  • \$:命令提示符(普通用户 $,root 用户 #)

设置环境变量的两种方式:

  1. 使用 export 命令(临时生效)

    1. export 变量名=值
    复制代码
  2. 通过配置文件(永久生效)

    • 系统级:/etc/profile、/etc/profile.d、/etc/bashrc、/etc/environment(对所有用户有效)
    • 用户级:~/.bash_profile、~/.bashrc(只对当前用户有效)

    将 export 变量名=值 写入配置文件即可。

export 常用选项:

选项说明
-f变量名称是一个函数名
-n删除指定变量(不输出到后续环境)
-p列出所有环境变量及其值
3.2.6 位置变量

用于接收传入 Shell 脚本的参数,也叫位置参数。

  • $n:第 n 个参数(n 从 1 开始)
  • n 大于 9 时需用 {} 括起来,如 ${10}
  • $0:脚本自身的名称
3.2.7 预定义变量
预定义变量作用
$#传递到脚本的参数数量
$*传递到脚本的所有参数内容
$?命令退出状态,0 表示正常退出,非 0 表示异常退出
$$当前进程的进程号

示例:

  1. #!/bin/bash
  2. echo "脚本参数数量: $#"
  3. echo "参数内容: $*"
  4. echo "本程序进程号: $$"
  5. echo "是否正常退出:$?"
复制代码

3.3 输入与输出

3.3.1 read — 读取输入

格式:read [选项] 变量列表

选项说明
-p 提示信息设置提示信息
-n 字符数量设置读取的字符数量
-s隐藏输入内容(不回显),用于密码等敏感信息
-r取消转义字符的转义作用
-t设置等待输入的时间(秒),防止无限等待

读取规则:

  • 一个变量:整行文本赋值给该变量
  • 多个变量:按空格分隔依次赋值
  • 变量 < 字段数:多余字段分配给最后一个变量
  • 变量 > 字段数:多出的变量不赋值

示例:

  1. #!/bin/bash
  2. read -p "请输入3个学生的成绩:" Lili yan zhouyi
  3. echo "3个学生的成绩:" $Lili $yan $zhouyi
  4. exit 0
复制代码
3.3.2 echo — 输出命令

格式:echo [选项] 字符串

选项说明
-n不在最后自动换行
-e解释转义字符
-E不解释转义字符(默认)

常用转义字符:

转义字符含义
\\反斜杠
\b退格键
\c取消行末的换行符号
\n换行字符
\r回车键
\t制表符

示例:

  1. echo "hello \nworld" # 不解释转义:hello \nworld
  2. echo -e "hello \nworld" # 解释转义:换行输出
复制代码
3.3.3 标准 I/O 与重定向
类型标识符文件编号默认设备
标准输入STDIN0键盘
标准输出STDOUT1显示器
标准错误STDERR2显示器

重定向:使用用户指定的文件,而非默认资源来获取或接收数据。

重定向类型运算符说明
标准输入重定向<从文件读取数据而非键盘
标准输出重定向>输出到文件而非显示器(覆盖)
标准输出追加>>追加到文件末尾
标准错误重定向2>错误信息输出到文件

示例:

  1. # 标准输出和错误分别重定向到不同文件
  2. ls -l hello first 2> error > result
复制代码

3.4 特殊符号

3.4.1 引号

(1)单引号 ' '

  • 屏蔽所有特殊字符的含义
  • 单引号内的每个字符都是字面意义
  1. NUM=100
  2. echo '$NUM' # 输出:$NUM
复制代码

(2)双引号 " "

  • 不会屏蔽具有特殊含义的字符(如 $、\ 等)
  1. echo "$NUM" # 输出:100
复制代码

(3)反引号 ` `

  • 实现命令替换,将命令执行结果赋值给变量或重定向
  • 也可以使用 $() 实现相同功能
  1. # 反引号方式
  2. time=`date`
  3. # $() 方式(推荐)
  4. dir=$(pwd)
复制代码
3.4.2 通配符
通配符说明
*与零个或多个字符匹配
?与任何单个字符匹配
[]与 [] 中的任一字符相匹配
[!]与 [] 之外的任一字符匹配

示例:

  1. # 列出 /etc 下以 sys 开头的文件
  2. ls -d /etc/sys*
  3. # 列出 /etc 下文件名由两个字符组成的文件
  4. ls -d /etc/??
  5. # 列出以 f~h 开头、以 .conf 结尾的文件
  6. ls /etc/[f-h]*.conf
  7. # 查找以 y 开头且不以 .conf 结尾的文件
  8. ls -d /etc/y*[!.conf]
复制代码
3.4.3 连接符
连接符说明
;按顺序依次执行多个命令
&&逻辑与:前一个命令成功才执行后一个
||逻辑或:前一个命令失败才执行后一个

示例:

  1. # 依次执行(无论成功失败)
  2. tar -xzvf gdb.tar.gz ; cd gdb ; ./configure ; make
  3. # 成功才继续
  4. cd dir && ls
  5. # 失败才执行
  6. cd dir || echo "目录不存在"
复制代码
3.4.4 管道

管道符号 |:将一个命令的输出作为另一个命令的输入。

格式:命令1 | 命令2 | 命令3 | … | 命令n

  1. # 列出 /etc 目录中包含 init 的行
  2. ls -l /etc | grep init
复制代码

3.5 数值运算

3.5.1 let 命令

格式:let 表达式列表

  • 表达式中包含空格或特殊字符时,必须用双引号包裹
  1. let x=3 y=5 z=9
  2. let x+=y # x = x + y
  3. let "sum = 5 + 6" # 有空格需加引号
复制代码
3.5.2 $(()) 运算

格式:$((数值表达式))

  1. echo $((5-3)) # 输出:2
复制代码
3.5.3 expr 命令

格式:expr 表达式

  • 运算符和操作数之间必须用空格分隔
  1. expr 1 + 1 # 输出:2
  2. x=10 y=12
  3. expr $x - $y # 输出:-2
复制代码

expr 字符串操作:

命令说明
expr length 字符串计算字符串长度
expr substr 字符串 start end提取子串(start 从 1 开始)
expr index 字符串 字符查找字符第一次出现的位置

示例:

  1. expr length abc # 输出:3
  2. expr substr helloworld 1 3 # 输出:hel
  3. expr index hellohehe e # 输出:2
复制代码

3.6 条件判断与语句

3.6.1 条件判断

Shell 中使用 test 语句或 [] 符号进行条件判断。

格式:

  1. test 条件表达式
  2. [ 条件表达式 ] # 注意括号内两边要有空格
复制代码

(1)字符串判断

条件说明
str1 = str2str1 等于 str2 则为真
str1 != str2str1 不等于 str2 则为真
-n strstr 不为空则为真
-z strstr 为空则为真

(2)算术判断

条件说明
expr1 -eq expr2相等则为真
expr1 -ne expr2不相等则为真
expr1 -gt expr2大于则为真
expr1 -ge expr2大于等于则为真
expr1 -lt expr2小于则为真
expr1 -le expr2小于等于则为真
!expr表达式为假则结果为真

(3)文件状态判断

条件说明
-d filefile 是目录则为真
-f filefile 是普通文件则为真
-r filefile 可读则为真
-w filefile 可写则为真
-x filefile 可执行则为真
-s filefile 大小不为 0 则为真
-a filefile 存在则为真

(4)逻辑判断

条件说明
expr1 -a expr2逻辑与,同时为真则结果为真
expr1 -o expr2逻辑或,一个为真则结果为真
!expr逻辑非,表达式为假则结果为真
3.6.2 if 条件语句

(1)单分支 if

  1. if [ 条件表达式 ]; then
  2. 命令语句
  3. fi
复制代码

注意:then 与 if 不在同一行时,if 后面不需要分号。

(2)双分支 if

  1. if [ 条件表达式 ]; then
  2. 命令语句1
  3. else
  4. 命令语句2
  5. fi
复制代码

(3)多分支 if

  1. if [ 条件表达式1 ]; then
  2. 命令语句1
  3. elif [ 条件表达式2 ]; then
  4. 命令语句2
  5. ...
  6. else
  7. 命令语句n
  8. fi
复制代码
3.6.3 case 语句

将变量或表达式的值与多个选项匹配,匹配成功则执行对应命令。

  1. case 变量或表达式 in
  2. 值1)
  3. 命令语句1
  4. ;;
  5. 值2)
  6. 命令语句2
  7. ;;
  8. ...
  9. *)
  10. 命令语句n
  11. ;;
  12. esac
复制代码

示例:根据输入数字判断周几

  1. #!/bin/bash
  2. read -p "请输入一个整数(0-7):" weekday
  3. case "$weekday" in
  4. 1)
  5. echo Monday
  6. ;;
  7. 2)
  8. echo Tuesday
  9. ;;
  10. ...
  11. 7)
  12. echo Sunday
  13. ;;
  14. *)
  15. echo error day
  16. ;;
  17. esac
复制代码

3.7 循环语句

3.7.1 for 循环

从列表中逐个获取元素,执行具体操作。

  1. for 变量 in 列表
  2. do
  3. 命令语句
  4. done
复制代码

示例:输出 12 个月份

  1. #!/bin/sh
  2. for month in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
  3. do
  4. echo -e "$month\t\c"
  5. done
  6. exit 0
复制代码

特殊形式:

  1. # 连续整数序列
  2. for var in {1..5}
  3. # 按步长跳跃
  4. for var in {1..100..2} # 步长为 2
复制代码
3.7.2 while 循环

条件为真则执行循环体,条件为假则退出循环。

  1. while [ 条件表达式 ]
  2. do
  3. 命令语句
  4. done
复制代码

示例:计算 1~100 的和

  1. #!/bin/sh
  2. count=1
  3. sum=0
  4. while [ $count -le 100 ]
  5. do
  6. sum=`expr $sum + $count`
  7. count=`expr $count + 1`
  8. done
  9. echo "sum=$sum"
  10. exit 0
复制代码
3.7.3 until 循环

与 while 相反:条件为假时执行循环体,条件为真时退出循环

  1. until [ 条件表达式 ]
  2. do
  3. 命令语句
  4. done
复制代码

示例:输出数值 1~5

  1. #!/bin/bash
  2. num=1
  3. until [ $num -gt 5 ]
  4. do
  5. echo $num
  6. let num++
  7. done
复制代码
3.7.4 select 语句

将多个选项做成菜单形式供用户选择,语法类似 for 循环。

  1. select 变量 in 列表
  2. do
  3. 命令语句
  4. break
  5. done
复制代码

示例:选择考试学科

  1. #!/bin/sh
  2. echo "请选择要考试的学科:"
  3. select subject in Android Java C++ Python
  4. do
  5. echo "你选择了 $subject"
  6. break
  7. done
  8. exit 0
复制代码

执行效果:

  1. 请选择要考试的学科:
  2. 1) Android
  3. 2) Java
  4. 3) C++
  5. 4) Python
  6. #? 3
  7. 你选择了 C++
复制代码

3.8 Shell函数

3.8.1 函数的定义与调用

Shell 函数相当于用户自定义的命令,函数名相当于命令名。

  1. 函数名()
  2. {
  3. 命令列表
  4. return 返回值
  5. }
复制代码

调用方式:函数名 参数列表

  • 函数调用前必须先定义
  • 函数参数使用位置变量传递($1、$2 等)
  • 函数返回值使用 $? 接收

示例:判断是否为偶数

  1. evenNum(){
  2. if [ $(($1 % 2)) -eq 0 ]; then
  3. return 1
  4. else
  5. return 0
  6. fi
  7. }
  8. read -p "请输入一个整数:" num
  9. evenNum $num
  10. if [ $? -eq 1 ]; then
  11. echo "$num 是偶数"
  12. else
  13. echo "$num 是奇数"
  14. fi
复制代码
3.8.2 函数中的变量
  • 全局变量:函数外部定义的变量
  • 局部变量:函数内部定义的变量
    • 函数调用前:只在函数内部有效
    • 函数调用后:作用域扩大,函数外部也有效
    • 与全局变量重名时:局部变量屏蔽全局变量
  • local 关键字:定义只在函数内部有效的局部变量

示例:

  1. choice1(){
  2. course=C++
  3. echo "张三喜欢课程是$course"
  4. }
  5. choice2(){
  6. local course=Python
  7. echo "李四喜欢的课程是$course"
  8. }
  9. course=Java
  10. echo "本学期主课程是$course" # Java
  11. choice1
  12. echo "本学期主课程是$course" # C++(被修改了)
  13. choice2
  14. echo "本学期主课程是$course" # C++(local 不影响外部)
复制代码

3.9 Shell数组

数组是一组数据的集合,数组元素使用索引标识位置,索引从 0 开始

3.9.1 数组定义

格式:数组名=(元素1 元素2 …)

  • 元素用 () 括起来,元素之间用空格分隔
  • 空数组使用 ()(不能省略)
  • = 两边不能有空格
3.9.2 数组访问

格式:${数组名[索引]}

  1. arr=(1 2 hello 你好)
  2. echo ${arr[0]} # 输出:1
  3. echo ${arr[2]} # 输出:hello
复制代码
3.9.3 数组常用操作

(1)访问所有元素

  • ${数组名[@]} 或 ${数组名
  • }
  1. echo ${arr[@]} # 输出:1 2 hello 你好
  2. echo ${arr[*]} # 输出:1 2 hello 你好
复制代码

@ 与 * 的区别:

  • "${arr[@]}":按原数组顺序依次给新数组元素赋值(每个元素独立)
  • "${arr
  • }":把所有元素作为一个整体赋值给新数组第一个元素
  1. arr1=("${arr[@]}")
  2. arr2=("${arr[*]}")
  3. echo ${arr1[0]} # 1
  4. echo ${arr2[0]} # 1 2 hello 你好
复制代码

(2)获取数组长度

  1. echo ${#arr[@]} # 输出:4
复制代码

(3)提取数组元素片段

格式:${数组名[@]:m:n} —— 从索引 m 开始,取 n 个元素

  1. echo ${arr[@]:1:3} # 输出:2 hello 你好
复制代码

(4)删除操作

  1. unset 数组名 # 删除整个数组
  2. unset 数组名[索引] # 删除数组中某一个元素
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行