一、Shell脚本基础速成(含防坑指南)
1.1 新手必知的脚本文件规范
- 文件必须以
#!/bin/bash
开头(重要!否则系统不知道用啥解释器) - 文件扩展名推荐用
.sh
(不是必须,但方便识别) - 执行权限必须给:
chmod +x your_script.sh
(血泪教训:新手90%的错误都是没给执行权限!!!)
1.2 变量操作黑科技
name="老王" # 等号两边不能有空格!
echo ${name} # 推荐带花括号的写法
readonly PI=3.14 # 声明常量
unset name # 删除变量
(注意:变量默认都是字符串类型,做数学运算要特殊处理)
1.3 流程控制骚操作
# if语句的正确姿势
if [ $a -gt $b ]; then
echo "a大于b"
elif [ $a -eq $b ]; then
echo "a等于b"
else
echo "a小于b"
fi
# while循环的正确打开方式
counter=0
while [ $counter -lt 5 ]
do
echo "当前计数:$counter"
((counter++))
done
(易错点:方括号两边必须有空格!)
二、实战案例精选(可直接抄作业)
2.1 文件批量处理神器
#!/bin/bash
# 批量重命名jpg文件(添加日期前缀)
for file in *.jpg
do
mv "$file" "$(date +%Y%m%d)_${file}"
done
(适用场景:整理手机照片/工作文档)
2.2 系统监控小助手
#!/bin/bash
# 监控CPU使用率超过80%时报警
while true
do
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if (( $(echo "$cpu_usage > 80" | bc -l) )); then
echo "$(date) CPU使用率过高:${cpu_usage}%" >> /var/log/system_monitor.log
# 这里可以添加邮件报警功能
fi
sleep 60
done
(生产环境实测有效,记得配置日志轮转)
2.3 自动化部署大招
#!/bin/bash
# 自动部署Java Web项目
TOMCAT_HOME="/opt/tomcat"
WAR_FILE="/tmp/myapp.war"
# 停止Tomcat
$TOMCAT_HOME/bin/shutdown.sh
# 等待进程结束
while ps -ef | grep tomcat | grep -v grep > /dev/null
do
sleep 1
done
# 清理旧部署
rm -rf $TOMCAT_HOME/webapps/myapp*
cp $WAR_FILE $TOMCAT_HOME/webapps/
# 启动Tomcat
$TOMCAT_HOME/bin/startup.sh
(适合中小型项目的快速迭代)
三、高级技巧大揭秘
3.1 调试技巧(救命必备)
# 在脚本开头添加这些选项
set -e # 遇到错误立即退出
set -u # 使用未定义变量时报错
set -x # 打印执行的命令(调试神器)
(组合使用效果更佳,生产环境记得关闭-x)
3.2 参数处理黑魔法
#!/bin/bash
# 处理命令行参数的高级姿势
while [[ "$#" -gt 0 ]]; do
case $1 in
-f|--file) file="$2"; shift ;;
-v|--verbose) verbose=1 ;;
*) echo "未知参数: $1"; exit 1 ;;
esac
shift
done
(支持长短参数,比getopts更灵活)
3.3 跨平台兼容秘籍
#!/bin/bash
# 检测系统类型
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
# Linux系统命令
elif [[ "$OSTYPE" == "darwin"* ]]; then
# MacOS系统命令
else
echo "不支持的操作系统"
exit 1
fi
(让你的脚本在Linux和Mac上都能跑)
四、常见坑点大全(血泪经验总结)
4.1 路径问题
- 总是使用绝对路径(避免脚本在不同目录执行出错)
- 特殊字符要用引号包裹:
rm "$filename"
4.2 权限问题
- sudo的正确用法:
echo "password" | sudo -S command
- 避免直接使用root运行脚本
4.3 编码问题
- 在脚本开头添加:
export LANG=en_US.UTF-8
- 处理中文文件名时特别小心
五、性能优化技巧
5.1 减少子进程调用
# 错误示范(产生多个子进程)
for i in $(seq 1 100); do
echo $i
done
# 正确姿势(避免多次调用seq)
for ((i=1; i<=100; i++)); do
echo $i
done
5.2 使用Here Document
# 批量创建用户
while read user pass
do
useradd "$user"
echo "$pass" | passwd --stdin "$user"
done << EOF
user1 123456
user2 654321
EOF
六、实战项目推荐
6.1 自动化服务器健康检查
- 检查磁盘使用率
- 检查内存剩余
- 检查重要进程状态
- 生成HTML报告
6.2 日志分析工具
- 分析Nginx访问日志
- 统计TOP 10访问IP
- 检测异常请求
- 自动发送日报邮件
6.3 个人工作流优化
- 自动备份开发环境配置
- 一键启动开发环境
- 自动同步工作文件到云存储
- 会议提醒脚本
七、学习资源推荐
7.1 官方文档
- Bash参考手册:
info bash
- GNU Coreutils文档
7.2 经典书籍
- 《Linux命令行与shell脚本编程大全》
- 《Shell脚本学习指南》
7.3 在线练习
- ShellCheck(在线语法检查)
- Explain Shell(命令解析神器)
写在最后
Shell脚本就像瑞士军刀,看起来简单但能解决各种实际问题。记住:
- 多写多练(光看教程是学不会的)
- 善用调试技巧(set -x是你的好朋友)
- 注意安全(特别是处理rm命令时)
- 保持代码可读性(你三个月后还要看得懂)
(最后的忠告:永远不要在生产环境直接运行未经测试的脚本!!!)