温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎样写好运维Shell脚本

发布时间:2026-07-02 20:44:01 来源:亿速云 阅读:106 作者:小樊 栏目:系统运维

写好运维 Shell 脚本,核心在于:稳定、可维护、可复用、可排错。下面从“原则 → 规范 → 实用技巧 → 常见坑 → 示例”系统讲一下。


一、写好运维脚本的 5 个核心原则

1️⃣ 明确目标,单一职责

一个脚本只做一件事,例如:

  • 只负责备份
  • 只负责部署
  • 只负责清理日志

避免“万能脚本”(后期维护噩梦)


2️⃣ 可重复执行(幂等性)

多次执行结果一致,例如:

  • 目录存在就跳过
  • 服务已启动就不重复启动
[ -d "/data/log" ] || mkdir -p /data/log

3️⃣ 可排错(可调试)

  • 出错即退出
  • 关键步骤有日志
  • 能知道“哪一步失败”

4️⃣ 可维护(人能看懂)

  • 变量清晰
  • 函数拆分
  • 注释到位

5️⃣ 可自动化

  • 支持参数
  • 支持 cron / CI / Ansible 调用

二、Shell 脚本规范(强烈建议)

✅ 1. 指定解释器

#!/usr/bin/env bash

#!/bin/sh 更好,功能更强。


✅ 2. 开启安全模式(非常重要)

set -euo pipefail

含义:

  • -e:命令失败立即退出
  • -u:使用未定义变量报错
  • -o pipefail:管道中任一命令失败整体失败

✅ 3. 定义变量规范

BASE_DIR="/data/app"
LOG_FILE="${BASE_DIR}/deploy.log"

✅ 建议:

  • 全大写
  • {} 包裹
  • 路径统一

✅ 4. 日志规范

log() {
  echo "[$(date '+%F %T')] $*"
}

log "开始部署应用"

日志要包含:

  • 时间
  • 动作
  • 结果

三、运维脚本常用结构模板

#!/usr/bin/env bash
set -euo pipefail

BASE_DIR="/data/app"
LOG_FILE="${BASE_DIR}/ops.log"

log() {
  echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"
}

check_env() {
  command -v docker >/dev/null || {
    log "docker 未安装"
    exit 1
  }
}

main() {
  log "脚本开始执行"
  check_env
  log "环境检查通过"
}

main "$@"

四、必须掌握的实用技巧

✅ 1. 参数处理

ACTION=${1:-start}

case "$ACTION" in
  start) echo "启动" ;;
  stop)  echo "停止" ;;
  *)     echo "用法: $0 {start|stop}" ;;
esac

✅ 2. 判断命令是否成功

if ! systemctl restart nginx; then
  log "nginx 重启失败"
  exit 1
fi

✅ 3. 捕获错误(异常兜底)

trap 'log "脚本异常退出"; exit 1' ERR

✅ 4. 锁文件(防止重复执行)

LOCK_FILE="/tmp/deploy.lock"

if [ -f "$LOCK_FILE" ]; then
  echo "已有实例在运行"
  exit 1
fi

touch "$LOCK_FILE"
trap "rm -f $LOCK_FILE" EXIT

✅ 5. 循环 + 重试(运维必备)

for i in {1..5}; do
  curl -s localhost:8080 && break
  sleep 2
done

五、常见坑(一定要避免)

❌ 使用 sh script.sh(可能忽略 bash 特性)
❌ 没检查命令是否存在
❌ 变量不加引号(空格直接炸)
❌ 用 rm -rf $DIR/(DIR 为空直接删根)
❌ 脚本里写密码明文

✅ 正确做法:

rm -rf "${DIR:?}/tmp"

六、进阶建议(运维高手)

✅ 1. 将脚本拆成函数

init_env()
check_service()
start_service()

✅ 2. 用配置文件

source config.env

✅ 3. 不直接用 root 执行

[ "$(id -u)" -eq 0 ] && echo "不要用 root 执行"

✅ 4. 配合 cron / ansible

*/5 * * * * /opt/scripts/check_nginx.sh >> /var/log/check.log 2>&1

七、一个完整运维脚本示例(备份)

#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/data/backup"
SRC_DIR="/var/www/html"
DATE=$(date +%F)
FILE="backup-${DATE}.tar.gz"

log() {
  echo "[$(date '+%F %T')] $*"
}

mkdir -p "$BACKUP_DIR"

log "开始备份 $SRC_DIR"
tar -czf "${BACKUP_DIR}/${FILE}" "$SRC_DIR"
log "备份完成: $FILE"

八、总结一句话

好的运维 Shell 脚本 = 像写代码一样写脚本,而不只是“敲命令”

如果你愿意,我可以:

  • 帮你 review 现有脚本
  • 给你 运维脚本模板(cron / 部署 / 监控)
  • 或按 生产级标准 重写一个你正在用的脚本
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI