脚本语言选型:Python vs Bash vs PowerShell

说实话,我刚入行那会,碰到脚本任务就一股脑用 Bash。后来在跨平台项目里栽了跟头——Windows 上的 .bat 跟 Linux 的 shell 完全不兼容,改来改去头发都掉了一半。从那以后,我才开始认真琢磨:到底该用哪种语言写巡检脚本?

这一章,我就把我这些年踩过的坑、总结的经验摊开来聊。Python、Bash、PowerShell,三种语言各有脾气,选对了事半功倍,选错了……嗯,你懂的。

三种语言的核心差异

先看一张快速对比表,心里有个底:

维度BashPythonPowerShell
主要平台Linux / macOS全平台Windows(现支持 Linux)
任务类型文件处理、进程管理复杂逻辑、数据处理.NET 系统管理、AD/O365
学习曲线低(但易写出引号地狱)中等中等偏高(对象管道)
可读性一般,缩进?不存在的强,强制缩进较好,动词-名词命名
库生态系统命令集成PyPI 海量库PowerShell Gallery + .NET
典型场景快速文件查找、日志切割API 调用、数据清洗、Web 巡检AD 用户管理、Azure 资源检查

选型铁律: 能用管道串系统命令的,用 Bash。需要面向对象处理复杂结构的,用 PowerShell。涉及网络、解析、报表的,用 Python。

Bash:轻巧但危险

我个人习惯把 Bash 当作瑞士军刀——短平快。比如写个检测磁盘使用率的脚本:

#!/bin/bash
# 检查磁盘使用率超过 80% 的分区
df -h | awk 'NR>1 {print $5, $6}' | while read pct mount; do
    pct=${pct%\%}
    if [ "$pct" -gt 80 ]; then
        echo "WARNING: $mount 使用率 $pct%"
    fi
done

你看,一行管道就搞定。但小心!我曾经在脚本里没加引号,遇到文件名带空格就直接炸了。Bash 变量展开的坑,除非你用 "$var" 保护起来,否则早晚中招。

我的避坑指南: 所有变量引用都用双引号包起来。写复杂的逻辑时,别硬撑,赶紧换 Python。

Python:万能胶,但需要装环境

Python 的优势在生态,尤其在巡检报表生成上。你要解析 JSON、调 REST API、画图表?Python 一行 import 搞定。我做过一个运维大盘,每天爬几十台机器的指标,用 requests + pandas 写个 50 行脚本就交付了。

不过也得承认,Python 有“启动慢”的毛病。跑一个简单命令还得装个 virtualenv,有时候真的挺烦。我个人建议:如果是临时查个日志,别开 Python,用 grep 得了。

#!/usr/bin/env python3
import subprocess, json

# 模拟一个巡检:检查关键进程是否存活
processes = ["nginx", "mysqld", "redis-server"]
results = {}
for proc in processes:
    ret = subprocess.run(
        ["pgrep", "-x", proc],
        capture_output=True
    )
    results[proc] = ret.returncode == 0

print(json.dumps(results, indent=2))

PowerShell:Windows 的王者,现在也能跨平台

讲真,我在 Windows 环境里做巡检,几乎只用 PowerShell。它的“对象管道”是神级设计——不是传文本,而是传 .NET 对象。取 WMI 信息、操作 AD、查 Exchange,简直像呼吸一样自然。

# 获取 Windows 服务状态,筛选停止的服务
Get-Service | Where-Object Status -eq 'Stopped' | Select-Object Name, DisplayName

但注意,PowerShell 的语法风格和传统 shell 差异很大。很多 Linux 老手第一次接触会被它的“动词-名词”命名搞晕。我也曾把 Select-Object 写成 Select-String 折腾半天……

曾经踩过的坑: 在 Linux 上跑 PowerShell 脚本,路径分隔符要特别注意——用 \ 兼容吗?不,得用 / 或 [System.IO.Path]::Combine。跨平台脚本记得写适配判断。

选型决策流程

光说概念不够,我画了张决策图,帮你快速定位该用哪种语言:

脚本语言选型决策流程 巡检任务来了 任务类型? 文件/进程 推荐:Bash 管道 + grep/awk 搞定 系统管理/AD 推荐:PowerShell Get-xxx + 对象管道 API/数据/报表 推荐:Python requests + pandas + jinja2 生成巡检报告

你想想看,如果任务是查几个文件里的关键字、调个系统服务状态,用 Bash 三行搞定,何必上 Python?反过来,要分析几百台机器的日志并生成折线图,Bash 就吃力了——得用 Python 的 matplotlib 或 pandas。

混合使用的实战经验

其实在实际巡检项目里,我很少只用一种语言。我有个习惯:

  • 数据采集层:用 Bash 或 PowerShell 快速收割系统信息
  • 数据处理层:用 Python 做格式化、聚合、异常检测
  • 报告展示层:用 Python 生成 HTML/PDF,或直接用 Pandoc 转换

比如我之前写过一个巡检框架,入口是 Bash 调度器,调用各个 Agent 的 Python 脚本来采集指标,最后用 Jinja2 模板合成报告。每个环节用最顺手的工具,这才是聪明的做法。

小建议: 团队里如果 Windows 和 Linux 机器都有,优先用 Python 写核心逻辑,再分别用原生 shell 做本地适配。这样维护成本最低。

最后说点避坑的实话

我曾经接手过一个巡检脚本,全用 Bash 写,足足 800 行。里面嵌套了 5 层 if 和正则,调试一次就是噩梦。从那以后我立了个规矩:

  1. 超过 50 行,就别用 Bash。 逻辑一复杂,Bash 的缺点全暴露。
  2. 要调外部 API? 直接切 Python,别用 curl + jq 拼凑。
  3. Windows 域环境? 别犹豫,PowerShell 是天选之子。
  4. 跨平台可移植? Python 是最稳妥的中间层。

选型这件事,没有银弹。但你只要按任务场景对号入座,基本不会跑偏。这一章讲的技巧,你在后续的巡检脚本实战里一定能用上。