写自动化脚本选 Python 还是 Shell 更好?

文章导读
多数日常运维任务用 Shell 更直接,涉及复杂逻辑、API 调用或跨平台需求时选 Python 更稳妥。
📋 目录
  1. A 快速处理思路
  2. B 代码实战对比
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
A A

多数日常运维任务用 Shell 更直接,涉及复杂逻辑、API 调用或跨平台需求时选 Python 更稳妥。

先说结论:没有绝对好坏,取决于任务复杂度和运行环境。

  • 适合:Shell 处理文件流转和系统命令,Python 处理数据计算和网络请求。
  • 重点看:脚本维护成本和错误处理机制,Python 异常捕获更完善。
  • 别忽略:目标服务器是否预装解释器,Shell 兼容性通常优于 Python。

快速处理思路

不用纠结语法,先按以下三个问题快速定方向:

  1. 任务是否能用单行或少量系统命令完成?是则选 Shell。
  2. 是否需要调用 HTTP 接口、处理 JSON 或复杂数学运算?是则选 Python。
  3. 脚本将来由谁维护?团队更熟悉哪种语言就选哪种。

代码实战对比

以“检查网站状态并记录日志”为例,对比两种语言的实现复杂度与异常处理。

写自动化脚本选 Python 还是 Shell 更好?

Shell 实现(依赖 curl)

#!/bin/bash
set -euo pipefail

url="https://example.com"
status=$(curl -s -o /dev/null -w "%{http_code}" "$url")

if [ "$status" -eq 200 ]; then
    echo "$(date) OK" >> /var/log/check.log
else
    echo "$(date) FAIL: $status" >> /var/log/check.log
    exit 1
fi

Python 实现(依赖 requests)

#!/usr/bin/env python3
import requests
import logging
from datetime import datetime

logging.basicConfig(filename='/var/log/check.log', level=logging.INFO)
url = "https://example.com"

try:
    r = requests.get(url, timeout=5)
    if r.status_code == 200:
        logging.info(f"{datetime.now()} OK")
    else:
        logging.error(f"{datetime.now()} FAIL: {r.status_code}")
except Exception as e:
    logging.error(f"{datetime.now()} ERROR: {e}")
    exit(1)

对比分析:Shell 脚本更短,但错误处理较弱(需手动检查退出码);Python 代码略多,但try...except能捕获网络超时、DNS 解析等异常,维护性更好。

分步处理

按以下步骤确认最终选型并落地:

  1. 明确需求:列出脚本需要完成的所有步骤,标记出涉及网络、数据库或复杂计算的部分。
  2. 检查环境:在目标机器执行以下命令确认解释器存在:
    which bash
    python3 `--version`
    若需生产环境运行,建议编写环境检测脚本:
    #!/bin/bash
    if ! command -v python3 &> /dev/null; then
        echo "Error: python3 not found"
        exit 1
    fi
  3. 编写原型:先写核心逻辑的几十行代码,验证关键库是否可用。Python 需注意虚拟环境,Shell 需注意路径。
  4. 评估维护:考虑半年后其他人能否看懂,Python 通常可读性更好。

怎么验证是否生效

脚本写好后,通过以下方式确认可靠性:

  • 检查退出码:执行脚本后运行echo $?,确保成功时返回 0,失败时非 0。
  • 调试模式:Shell 使用bash -x script.sh查看执行流程;Python 使用python3 -u script.py确保输出不缓冲。
  • 日志记录:关键步骤打印日志到文件或标准输出,便于排查。
  • 异常测试:故意制造错误环境(如断网、文件缺失),看脚本是否优雅退出而非直接崩溃。

常见坑

  • Shell 空格敏感:赋值时等号两边不能有空格,判断语句[ ]内两侧要有空格。错误示例:if [ $a=1 ]
  • Python 版本差异:Python 2 和 3 语法不兼容,生产环境务必指定解释器路径(如#!/usr/bin/env python3)。
  • 路径问题:cron 任务中环境变量较少,建议使用绝对路径调用命令和文件,或在脚本开头cd /path/to/workdir
  • 编码问题:处理中文日志时,Python 需声明# -*- coding: utf-8 -*-,Shell 需注意export LANG=en_US.UTF-8
  • 依赖缺失:Python 脚本迁移时需确认requests等库已安装,可使用pip3 freeze > requirements.txt管理依赖。
  • 权限不足:写入日志文件时常见Permission denied,确保运行用户有写权限或使用sudo