一、Shell 与基础概念
1. Shell 的作用
Shell 是命令解释器
功能:
- 接收用户输入的命令
- 解析命令
- 调用内核执行程序
支持:
- 变量
- 管道
- 重定向
- 条件执行
二、Shell 变量
1. 变量的定义
name=string等号两边不能有空格
变量名规则:
- 字母或下划线开头
- 由字母、数字、下划线组成
2. 变量的引用
echo$name$name→ 变量替换引号规则:
- 双引号
" ":允许变量替换 - 单引号
' ':不允许变量替换
- 双引号
3. 变量的作用域
局部变量
- 只在当前 shell 有效
全局变量
- 当前 shell + 子 shell
- 使用
export导出
exportvar三、环境变量
1. 什么是环境变量
由 shell 预定义并赋值
决定系统行为,如:
PATHHOMESHELL
全部是全局变量
2. 查看与设置
set# 查看所有环境变量echo$PATH# 引用环境变量3. 修改 PATH
PATH=/tmp:$PATH4. 环境配置文件
系统级
/etc/profile
用户级
- 登录 shell:
~/.bash_profile - 非登录 shell:
~/.bashrc
- 登录 shell:
四、命令执行逻辑控制
1. 分号;
- 顺序执行
- 不判断前一条命令是否成功
cmd1;cmd22. 命令返回值$?
0→ 成功非 0→ 失败
3. 与、或逻辑
| 符号 | 含义 | |
|---|---|---|
&& | 前成功,才执行后 | |
| ` | ` | 前失败,才执行后 |
常见组合(非常重要)
lsdir||mkdirdir&&touchdir/file👉 实现:
- 目录不存在 → 创建目录 → 创建文件
- 目录存在 → 直接创建文件
五、grep 高级用法
1. 基本格式
grep[选项]'模式'文件2. 常用选项
| 选项 | 作用 |
|---|---|
-n | 显示行号 |
-i | 忽略大小写 |
-v | 反向匹配 |
-A n | 显示后 n 行 |
-B n | 显示前 n 行 |
--color=auto | 关键字高亮 |
3. 管道配合 grep
dmesg|grepIPv6六、基础正则表达式(重点 + 考点)
1. 字符匹配
| 符号 | 含义 |
|---|---|
. | 任意一个字符 |
* | 前一个字符重复 0~∞ 次 |
2. 字符集合
[abc]# a 或 b 或 c[a-z]# 小写字母[^a-z]# 非小写字母3. 行首 / 行尾
| 符号 | 含义 |
|---|---|
^ | 行首 |
$ | 行尾 |
^$ | 空行 |
4. 重复次数限定
o\{2\}# 正好 2 个 oo\{2,5\}# 2~5 个 oo\{2,\}# 至少 2 个 o5. 常见实用模式
| 需求 | 正则 |
|---|---|
| 包含数字 | [0-9] |
| 任意数字串 | [0-9][0-9]* |
| g 开头 g 结尾 | g.*g |
七、重定向(I/O)
1. 三种重定向
| 类型 | 描述 |
|---|---|
| 输入 | < |
| 输出 | > |
| 追加 | >> |
| 错误 | 2> |
| 全部 | &> |
2. 常见用法
ls>filels2>err cmd&>all.log3./dev/null
- 空设备(黑洞)
- 丢弃不需要的输出
grepIPv6 /etc/*2>/dev/null八、管道|
1. 管道的本质
- 前一个命令的输出 → 后一个命令的输入
- 每个命令是独立进程
- 单向、从左到右
2. 常见组合
catfile|grepkeywordls/etc|moretail-15file|head-3rpm-qa|grepssh九、整体逻辑框架(建议记住)
Shell ├── 变量 │ ├── 普通变量 │ ├── 作用域 │ └── 环境变量 ├── 命令控制 │ ├── ; │ ├── && │ └── || ├── 文本处理 │ ├── grep │ └── 正则表达式 ├── I/O 控制 │ ├── 重定向 │ └── 管道案例:批量统计当前目录下每个.txt文件的行数
场景说明
你有很多.txt文件,想快速知道每个文件有多少行,并按行数从小到大排序。
命令
wc-l *.txt|sort-n命令拆解说明
wc -l
👉 统计行数(word count 的 line 模式)*.txt
👉 匹配当前目录下所有.txt文件|(管道)
👉 把前一个命令的输出,传给下一个命令作为输入sort -n
👉 按数字大小排序(而不是按字符串)
示例输出
12 a.txt 58 b.txt 134 c.txt表示:
a.txt有 12 行b.txt有 58 行c.txt有 134 行
进阶一点(只看前 3 个最小的)
wc-l *.txt|sort-n|head-31️⃣ 查找包含关键词的文件内容(日志常用)
grep"error"*.log👉 在当前目录所有.log文件中查找包含error的行
常用变体:
grep-i"error"*.log# 忽略大小写grep-n"error"*.log# 显示行号2️⃣ 统计某个目录下文件数量
ls|wc-l👉 统计当前目录文件数(不含隐藏文件)
包含隐藏文件:
ls-a|wc-l3️⃣ 批量重命名文件(很常用)
把.txt改成.md:
forfin*.txt;domv"$f""${f%.txt}.md"done👉${f%.txt}是 Shell 的字符串截取
4️⃣ 查看占用磁盘空间最大的文件/目录
du-sh *|sort-h|tail-5👉 找出当前目录下最大的 5 个文件/目录
5️⃣ 统计某个文件中每个单词出现的次数
catfile.txt|tr' ''\n'|sort|uniq-c|sort-nr👉 常用于文本分析、面试题
6️⃣ 判断文件是否存在(脚本必备)
if[-f"test.txt"];thenecho"文件存在"elseecho"文件不存在"fi7️⃣ 一行 Shell:找出 CPU 占用最高的进程
psaux|sort-nrk3|head-5👉 第 3 列是 CPU 使用率
8️⃣ 定时执行命令(crontab 示例)
每 5 分钟执行一次脚本:
*/5 * * * * /path/to/script.sh9️⃣ 一行脚本:批量杀死包含关键词的进程(慎用⚠️)
psaux|grepjava|grep-vgrep|awk'{print$2}'|xargskill-9🔟 一个完整小脚本示例
#!/bin/bashforfin*.log;doecho"$f行数:$(wc-l<"$f")"done运行前记得:
chmod+x count.sh ./count.sh1️⃣ 判断参数并打印(入门必会)
print.sh
#!/bin/bashif[$#-eq0];thenecho"用法:$0参数"exit1fiecho"你输入的参数是:$1"运行:
./print.sh hello2️⃣ 批量备份文件(实战常用)
backup.sh
#!/bin/bashSRC_DIR=/data/logsBACKUP_DIR=/data/backupDATE=$(date+%Y%m%d)mkdir-p"$BACKUP_DIR"tar-czf"$BACKUP_DIR/logs_$DATE.tar.gz""$SRC_DIR"echo"备份完成: logs_$DATE.tar.gz"3️⃣ 循环读取文件内容(处理配置/名单)
readfile.sh
#!/bin/bashwhilereadline;doecho"读取到:$line"done<users.txt4️⃣ 统计目录下文件类型数量
count_file_type.sh
#!/bin/bashtxt=0log=0forfin*;docase"$f"in*.txt)((txt++));;*.log)((log++));;esacdoneecho"txt 文件:$txt"echo"log 文件:$log"5️⃣ 检测服务是否运行(运维高频)
check_service.sh
#!/bin/bashSERVICE=nginxifpgrep"$SERVICE">/dev/null;thenecho"$SERVICE正在运行"elseecho"$SERVICE未运行"fi6️⃣ 自动清理 7 天前的日志
clean_log.sh
#!/bin/bashLOG_DIR=/var/log/myappfind"$LOG_DIR"-type f -mtime +7 -name"*.log"-execrm-f{}\;echo"7 天前日志已清理"7️⃣ 简单菜单脚本(交互式)
menu.sh
#!/bin/bashecho"1) 查看磁盘"echo"2) 查看内存"echo"3) 退出"read-p"请选择: "choicecase$choicein1)df-h;;2)free-h;;3)exit;;*)echo"无效选择";;esac8️⃣ Shell 脚本模板(推荐收藏)
#!/bin/bashset-e# 变量定义# 函数定义# 主逻辑💡 常见执行问题
chmod+x xxx.sh# 没权限bashxxx.sh# 直接用 bash 运行。