运维 Shell 脚本 入门教程

admin

运维 Shell 脚本入门教程

一、Shell 脚本的核心价值

在运维工作中,Shell脚本是自动化部署、监控和运维的核心工具。据统计,超过80%的运维日常任务(如日志清理、服务重启、数据备份)依赖Shell脚本实现。通过编写脚本,运维人员可将重复性操作转化为一键式流程,显著提升工作效率。例如,某云计算平台通过优化Shell脚本将部署效率提升300%,同时降低人为操作错误率至0.1%以下。

二、基础语法与常用命令

2.1 脚本结构与执行

创建新脚本:

echo "#!/bin/bash" > backup.sh

设置执行权限:

chmod +x backup.sh

执行脚本:

./backup.sh

2.2 变量与参数处理

定义环境变量:

export PATH=/opt/tools:$PATH

获取脚本参数:

for arg in "$@"; do
  echo "参数:$arg"
done

2.3 条件判断与循环

if-else结构:

if [ $(free -m | awk '/Mem/ {print $2}') -gt 80 ]; then
  echo "内存不足,触发告警"
  notify-send "系统告警" "内存使用率超过80%"
else
  echo "内存正常"
fi

循环示例:

while [ ! -f /var/log/monitor.log ]; do
  sleep 5
done

三、核心功能实现技巧

3.1 文件操作自动化

批量重命名脚本:

find /home/user -name "*.sh" -exec bash {} \;

定时压缩归档:

0 2 * * * /bin/bash <<EOF
tar -czvf /backup/data-$(/bin date +%Y%m%d).tar.gz /var/www
EOF

3.2 网络监控脚本

实时监控TCP连接:

while true; do
  netstat -ant | grep 'ESTABLISHED' | wc -l
  if [ $? -gt 100 ]; then
    echo "异常连接数:$?" >> /var/log/network.log
  fi
  sleep 30
done

3.3 服务管理脚本

编写通用服务管理脚本:

#!/bin/bash
service_name=$1
status=$(systemctl status $service_name | grep "Active")
if [[ $status == "active" ]]; then
  systemctl restart $service_name
  echo "服务已重启:$service_name"
else
  systemctl start $service_name
  echo "服务已启动:$service_name"
fi

四、进阶技巧与最佳实践

4.1 错误处理机制

添加try-catch结构:

#!/bin/bash
try {
  # 正常执行代码
} catch {
  # 异常捕获逻辑
  echo "捕获异常:$?" >> error.log
  exit 1
}

4.2 性能优化技巧

  • 使用tee命令实现日志实时追加:
    echo "当前时间:$(date)" | tee -a /var/log/system.log
  • 利用find命令的多选项组合:
    find /var/www -type f -name "*.html" -exec grep -rl "error" {} \;

4.3 安全防护措施

  • 禁止脚本的set --命令:
    #!/bin/bash
    set -- "$@"
    shift
  • 设置脚本沙箱环境:
    chroot /path/to/chroot /bin/sh -c "exec /path/to/script"

五、典型应用场景实战

5.1 日志分析自动化

编写日志解析脚本:

#!/bin/bash
LOG_FILE="/var/log/app.log"
COUNT=10

# 查找最近10次错误
grep -i "error" $LOG_FILE | head -n $COUNT

# 统计错误类型
grep -i "error" $LOG_FILE | awk '{print $3}' | sort | uniq -c

5.2 资源监控看板

创建监控脚本并生成HTML报告:

#!/bin/bash
CPU=$(top -b | grep "Cpu(s)" | awk '{print $2}' | cut -d.)
MEM=$(free -m | awk '/Mem/ {print $2}')
DISK=$(df -h | awk '//dev/sda1/ {print $3}' | cut -d% -f1)

echo "<h1>监控报告</h1>" > report.html
echo "<p>CPU使用率:$CPU%</p>" >> report.html
echo "<p>内存使用:$MEMMB</p>" >> report.html

5.3 自动化部署流程

完整部署脚本示例:

#!/bin/bash
# 环境准备
apt-get update && apt-get install -y python3-pip

# 安装依赖
pip3 install requests

# 下载并配置应用
wget https://example.com/app.tar.gz
tar -xzvf app.tar.gz
cd app && pip3 install -r requirements.txt

# 启动服务
./start.sh &

# 监控端口
while true; do
  netstat -tuln | grep 8080
  if [ $? -ne 0 ]; then
    systemctl restart app-service
  fi
  sleep 60
done

六、常见问题解决方案

6.1 权限不足问题

# 检查当前用户权限
if [ $(id -u) -ne 0 ]; then
  echo "错误:需要root权限执行此脚本"
  exit 1
fi

6.2 脚本性能瓶颈

  • 使用nice命令调整优先级:
    nice -n 10 /path/to/slow_script.sh
  • 将I/O密集型任务拆分为后台线程:
    (sleep 10; echo "后台任务完成") &

6.3 脚本兼容性问题

#!/bin/bash
if [ $(command -v bash) ]; then
  # Bash环境执行
  echo "Bash版本:$(bash --version)"
else
  # fallback到其他Shell
  echo "未知Shell环境"
  exit 1
fi

七、学习进阶路径

  1. 语法深化:掌握Bash条件表达式([ ])、函数定义(func() { ... })
  2. 工具集成:学习expect自动化命令行操作、rsync实现增量同步
  3. 容器化应用:将脚本封装为Docker镜像(参考docker commit命令)
  4. 持续集成:配置Jenkins/GitLab CI执行脚本自动化测试

八、最佳实践总结

  1. 脚本规范

    • 使用shebang开头(#!/bin/bash)
    • 每行代码添加注释
    • 分段执行(函数化)
  2. 安全准则

    • 禁用危险命令(set --exec
    • 使用sudo时限制最小权限
    • 敏感信息加密存储(参考gpg命令)
  3. 性能优化

    • 避免在循环内执行耗时操作
    • 使用管道代替多个进程调用
    • 启用Shell的数组语法($@
  4. 调试技巧

    • 启用调试模式(set -x
    • 使用bash -x直接执行调试
    • 分段测试(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

建议每天编写1个实用脚本,持续3个月可掌握90%的运维Shell技能。重点突破日志分析、服务监控、自动化部署三大场景,同时关注ShellCheck工具的代码规范检查。

文章版权声明:除非注明,否则均为xmsdn原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码