💻 Shell 开发
Shell是Linux/Unix系统的命令解释器和脚本语言,运维自动化的核心工具。
学习时间线
2020年6月 - 2020年10月(5个月)
阶段一:Shell基础(2020-06)
Shell类型(Bash、Zsh)
变量、数据类型、运算符
流程控制、函数
输入输出、重定向
阶段二:文本处理(2020-07)
grep:文本搜索
sed:流编辑器
awk:文本分析
三剑客组合使用
阶段三:实战应用(2020-09)
系统监控脚本
日志分析脚本
备份脚本
批量处理脚本
部署自动化
学习文档
01-Shell基础.md - Shell语法、变量、流程控制、函数
02-文本处理三剑客.md - grep、sed、awk详解
03-实用脚本.md - 系统管理、日志分析、备份部署
Shell核心特性
语言特性
简单语法:易学易用,快速编写脚本
命令集成:直接调用系统命令
管道机制:命令组合,功能强大
正则表达式:文本处理能力强
进程控制:后台任务、信号处理
文本处理三剑客
grep:搜索过滤,正则匹配
sed:流编辑,替换删除
awk:分析统计,列处理
应用场景
系统运维:监控、巡检、告警
日志分析:统计、过滤、报表
自动化部署:CI/CD流程
批量处理:文件操作、格式转换
定时任务:备份、清理、同步
常用命令速查
文件操作
ls, cd, pwd, mkdir, rm, cp, mv
cat, head, tail, less, more
find, locate, which, whereis
chmod, chown, chgrp
tar, gzip, zip, unzip
文本处理
grep, egrep, fgrep
sed
awk
cut, sort, uniq, wc
tr, diff, patch
系统管理
ps, top, htop, kill
systemctl, service
df, du, free
netstat, ss, lsof
crontab, at
网络工具
ping, traceroute, nslookup
curl, wget
ssh, scp, rsync
nc, telnet
项目实践
常用脚本类型
监控脚本 - CPU、内存、磁盘、服务监控
日志分析 - 访问日志、错误日志统计
备份脚本 - 数据库备份、文件同步
部署脚本 - 应用部署、容器管理
批处理 - 文件重命名、格式转换
脚本模板
#!/usr/bin/env bash
set -euo pipefail # 严格模式
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly LOG_FILE="/var/log/script.log"
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
cleanup() {
log "清理资源..."
}
trap cleanup EXIT
main() {
log "开始执行..."
# 主逻辑
}
main "$@"
最佳实践
脚本规范
Shebang:
#!/usr/bin/env bash严格模式:
set -euo pipefail变量引用:
"$var"而不是$var函数分解:逻辑清晰,单一职责
错误处理:检查命令返回值
日志记录:关键操作留痕
参数校验:检查输入有效性
变量命名
# 小写:局部变量
local_var="value"
# 大写:环境变量/常量
readonly MAX_COUNT=100
export PATH=$PATH:/usr/local/bin
# 明确引用
"${var}" # 推荐
"${var:-default}" # 默认值
"${var:?error}" # 未定义报错
"${var/old/new}" # 替换
错误处理
# 检查命令存在
if ! command -v git &> /dev/null; then
echo "git 未安装"
exit 1
fi
# 检查文件
if [ ! -f "$file" ]; then
echo "文件不存在: $file"
exit 1
fi
# 检查命令状态
if ! some_command; then
echo "命令失败"
exit 1
fi
# 捕获错误行号
trap 'echo "错误在第 $LINENO 行"' ERR
性能优化
# 避免不必要的管道
# ❌ 慢
cat file | grep pattern
# ✅ 快
grep pattern file
# 使用内建命令
# ❌ 慢(外部命令)
result=$(basename "$path")
# ✅ 快(参数扩展)
result="${path##*/}"
# 批量处理用while
# ❌ 慢(每次fork)
for line in $(cat file); do
process "$line"
done
# ✅ 快(管道)
while IFS= read -r line; do
process "$line"
done < file
调试技巧
调试选项
bash -x script.sh # 打印执行命令
bash -n script.sh # 检查语法
bash -v script.sh # 打印原始命令
# 脚本内控制
set -x # 开启
set +x # 关闭
调试函数
debug() {
[ "$DEBUG" = "1" ] && echo "DEBUG: $*" >&2
}
# 使用
DEBUG=1 ./script.sh
ShellCheck
# 安装静态分析工具
apt install shellcheck
# 检查脚本
shellcheck script.sh
# 忽略特定规则
# shellcheck disable=SC2086
grep、sed、awk选择
使用场景
任务 |
工具 |
理由 |
|---|---|---|
搜索过滤 |
grep |
专用,最快 |
简单替换 |
sed |
流编辑专用 |
列处理 |
awk |
列处理最强 |
统计计算 |
awk |
支持变量数组 |
复杂逻辑 |
awk |
接近编程语言 |
组合使用
# 典型流程
grep "pattern" file.log | # 过滤
sed 's/old/new/g' | # 替换
awk '{print $1, $3}' | # 提取列
sort | uniq -c # 统计
# 避免不必要的管道
# ❌
grep "pattern" file | awk '{print $1}'
# ✅
awk '/pattern/ {print $1}' file
常见陷阱
1. 变量不加引号
# ❌ 变量包含空格会出错
rm $file
# ✅
rm "$file"
2. 比较运算符混淆
# ❌ 字符串比较用数值运算符
[ "$str" -eq "value" ]
# ✅
[ "$str" = "value" ]
3. 管道中变量作用域
# ❌ 管道创建子shell,count不生效
count=0
cat file | while read line; do
((count++))
done
echo $count # 0
# ✅
count=0
while read line; do
((count++))
done < file
echo $count # 正确
4. 文件名中的空格
# ❌
for file in $(ls *.txt); do
process $file
done
# ✅
while IFS= read -r -d '' file; do
process "$file"
done < <(find . -name "*.txt" -print0)
学习资源
在线资源
Bash官方手册:https://www.gnu.org/software/bash/manual/
Advanced Bash-Scripting Guide
ShellCheck:https://www.shellcheck.net/
Explain Shell:https://explainshell.com/
推荐书籍
《Linux命令行与shell脚本编程大全》
《sed与awk》
《精通正则表达式》
练习平台
HackerRank Shell
LeetCode Shell题目
实际生产环境问题
应用领域
DevOps
CI/CD脚本
自动化部署
配置管理
容器管理
运维
系统监控
日志分析
备份恢复
告警通知
数据处理
日志清洗
格式转换
统计分析
报表生成
学习心得
实用主义:Shell重在解决实际问题
简洁为美:复杂逻辑用Python等其他语言
三剑客必会:grep/sed/awk是核心技能
管道思维:组合简单命令实现复杂功能
错误处理:生产环境必须严谨
日志记录:关键操作可追溯
模板复用:建立常用脚本库
持续学习:新工具新特性不断涌现
实践为主:看千遍不如手写一遍
代码审查:用ShellCheck检查规范
核心: Shell是Linux运维的基本功,掌握基础语法和三剑客可解决大部分实际问题。复杂逻辑建议用Python/Go等语言。