脚本语言选型:Python vs Bash vs PowerShell
说实话,我刚入行那会,碰到脚本任务就一股脑用 Bash。后来在跨平台项目里栽了跟头——Windows 上的 .bat 跟 Linux 的 shell 完全不兼容,改来改去头发都掉了一半。从那以后,我才开始认真琢磨:到底该用哪种语言写巡检脚本?
这一章,我就把我这些年踩过的坑、总结的经验摊开来聊。Python、Bash、PowerShell,三种语言各有脾气,选对了事半功倍,选错了……嗯,你懂的。
三种语言的核心差异
先看一张快速对比表,心里有个底:
| 维度 | Bash | Python | PowerShell |
|---|---|---|---|
| 主要平台 | 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 三行搞定,何必上 Python?反过来,要分析几百台机器的日志并生成折线图,Bash 就吃力了——得用 Python 的 matplotlib 或 pandas。
混合使用的实战经验
其实在实际巡检项目里,我很少只用一种语言。我有个习惯:
- 数据采集层:用 Bash 或 PowerShell 快速收割系统信息
- 数据处理层:用 Python 做格式化、聚合、异常检测
- 报告展示层:用 Python 生成 HTML/PDF,或直接用 Pandoc 转换
比如我之前写过一个巡检框架,入口是 Bash 调度器,调用各个 Agent 的 Python 脚本来采集指标,最后用 Jinja2 模板合成报告。每个环节用最顺手的工具,这才是聪明的做法。
小建议: 团队里如果 Windows 和 Linux 机器都有,优先用 Python 写核心逻辑,再分别用原生 shell 做本地适配。这样维护成本最低。
最后说点避坑的实话
我曾经接手过一个巡检脚本,全用 Bash 写,足足 800 行。里面嵌套了 5 层 if 和正则,调试一次就是噩梦。从那以后我立了个规矩:
- 超过 50 行,就别用 Bash。 逻辑一复杂,Bash 的缺点全暴露。
- 要调外部 API? 直接切 Python,别用
curl+jq拼凑。 - Windows 域环境? 别犹豫,PowerShell 是天选之子。
- 跨平台可移植? Python 是最稳妥的中间层。
选型这件事,没有银弹。但你只要按任务场景对号入座,基本不会跑偏。这一章讲的技巧,你在后续的巡检脚本实战里一定能用上。