文章目录
一、为什么要学Shell脚本?(真香警告)
各位打工人注意了!!!当你还在手动处理日志文件时,别人已经用5行脚本搞定周报统计;当你守着服务器敲命令时,大神早就用定时脚本自动巡检系统了(血泪教训)!Shell脚本作为Linux系统的"瑞士军刀",绝对是运维、开发、测试人员必会的生存技能!
最近公司新来的实习生因为不会写脚本,硬是花2小时手动处理了本该5分钟完成的日志分析…(领导看了直摇头)
二、新手必会的20个基础案例
1. 文件管理三剑客
#!/bin/bash
# 批量重命名(实战高频!!!)
for file in *.txt; do
mv "$file" "backup_${file}"
done
# 自动清理7天前的日志(系统管理员必会)
find /var/log -type f -mtime +7 -exec rm {} \;
2. 系统监控三板斧
# 内存报警脚本(救过我的年终奖)
if [ $(free | awk '/Mem/{printf("%d"), $3/$2*100}') -gt 90 ]; then
echo "内存爆了!" | mail -s "紧急警报" admin@example.com
fi
3. 文本处理骚操作
# 提取nginx日志中的TOP10 IP(分析必备)
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
(偷偷说:把#!/bin/bash改成#!/usr/bin/env bash会更专业哦~)
三、进阶玩家的50个实战技巧
1. 防呆设计指南
set -euo pipefail # 让你的脚本更健壮(超级重要!!!)
trap "echo 脚本被中断!退出码$?" EXIT # 异常捕获
2. 交互式脚本开发
read -p "请输入你的幸运数字:" num
case $num in
[0-9]) echo "基本操作" ;;
*) echo "搞事情?" >&2 ;;
esac
3. 跨平台兼容秘籍
if [[ "$OSTYPE" == "darwin"* ]]; then
alias date=gdate # MacOS兼容大法
fi
(实测经验:用[[ ]]代替[ ]能避免很多坑!)
四、高手必备的30个企业级案例
1. 自动化部署流水线
#!/usr/bin/env bash
# 安全传输+校验+备份一条龙
scp -i key.pem app.tar user@server:/opt/
ssh -i key.pem user@server "tar xf /opt/app.tar &&
md5sum /opt/app.tar | tee checksum.txt &&
mv /old_app /backup/old_app_$(date +%s)"
2. 智能日志分析系统
#!/bin/bash
# 实时监控+自动分析
tail -f /var/log/app.log |
while read line; do
if grep -q "ERROR" <<< "$line"; then
echo "$(date) 发现异常:$line" >> error_report.log
# 自动触发钉钉报警...
fi
done
3. 分布式任务调度框架
# 主节点
cat task.list | xargs -P 4 -I {} ssh node{} 'bash task.sh'
# 配合ansible食用更香~
五、避坑指南(血泪总结)
- 变量引用的天坑:
# 错误示范:
if [ $var = "test" ]; then... # 当var为空时会报错!
# 正确姿势:
if [ "${var}" = "test" ]; then...
- 空格敏感症:
[ $a == $b ] # 错误!
[ "$a" == "$b" ] # 正确
- 路径中的特殊字符:
mkdir "奇怪的名字&*" # 一定要加引号!!!
(记不住?用shellcheck工具自动检查语法!)
六、学习路线图(亲测有效)
-
新手村任务:
- 《Linux命令行与Shell脚本编程大全》
- 每天写10个实用小脚本
-
进阶副本:
- 通读GNU Coreutils文档
- 研究Ansible源码中的shell模块
-
终极挑战:
- 用纯Shell实现简易Docker
- 参加Google Shell编程大赛
最后说句掏心窝的:别光收藏不练习啊各位!我电脑里存了200多个脚本模板,都是这些年踩坑总结的,需要的可以留言讨论(当然得先关注啦~)!
彩蛋:在脚本开头加一行
# vim: set ft=sh ts=4 sw=4 et:
会让你的代码更专业(装X必备)!