Appearance
01|Shell 脚本是什么、为什么要写
Linux 基础系列里学的都是一条一条的命令——敲一条 df -h 看磁盘,敲一条 free -h 看内存,敲一条 ps 看进程。
但真实运维不是敲一条命令就完事。排查磁盘满了,要敲一串:先 df -h 定位哪个盘满了,再 du -sh /* 找大目录,再 find 找大文件,最后清理。每次磁盘告警都重复敲这一串,漏一步或敲错一步就可能出事。十台机器查一遍就是十次重复。
Shell 脚本解决的就是这个——把一串命令写进文件,一次执行、可重复、可审计。
一、脚本和单条命令的区别
把命令写进文件,让系统按顺序执行,这个文件就是脚本。最简单的一个:
bash
# check-disk.sh
df -h
du -sh /var/log/* | sort -hr | head -5把这个文件跑一下:
bash
bash check-disk.sh效果和手动敲这两条命令一样。区别是:以后每次磁盘告警,直接 bash check-disk.sh 一条命令搞定,不用记一串,也不会漏步。机器多了还能配着 SSH 批量跑,十台机器一个循环搞定。
脚本还能加判断——只有磁盘超过 80% 才告警、清理前先确认文件能不能删、失败时退出并报错。这些靠单条命令做不到。
二、Shell 和 Python 的分工
写自动化可以用 Shell,也可以用 Python。各有适用场景。
Shell 脚本的强项是串联系统命令:调 df、grep、awk、curl,把它们用管道和重定向串起来处理文本和系统状态。Linux 自带就能跑,不用装任何运行时。运维里大量的"查个状态、清个日志、批量跑个命令"用 Shell 写最直接。
Python 的强项是复杂逻辑和数据结构:要解析 JSON、调 API、处理复杂对象、做数学计算、写大型程序。Python 标准库丰富,但语法和命令行工具的结合不如 Shell 直接。
判断标准很简单:主要是调系统命令处理文本,用 Shell;主要是逻辑运算和数据处理,用 Python。一个磁盘巡检脚本用 Shell 写十来行,用 Python 反而啰嗦;一个调 API 拉数据生成报表的任务,用 Python 清晰,用 Shell 写会很难维护。
本系列讲 Shell 脚本。Python 脚本有专门的系列。
三、第一个脚本
写一个能跑的脚本,走一遍完整流程。先建文件:
bash
vim hello.sh内容:
bash
#!/usr/bin/env bash
echo "hello shell"
echo "当前用户: $(whoami)"
echo "当前目录: $(pwd)"第一行 #!/usr/bin/env bash 是 shebang,告诉系统用 bash 执行这个文件。后面三行是命令,$(...) 是命令替换——先跑里面的命令,把输出塞回原位置。
执行它:
bash
bash hello.shtext
hello shell
当前用户: root
当前目录: /root脚本跑起来了。但每次都要写 bash hello.sh 不方便,想直接 ./hello.sh 跑,得加执行权限:
bash
chmod +x hello.sh
./hello.shtext
hello shell
当前用户: root
当前目录: /root两种执行方式的区别:bash hello.sh 是显式用 bash 解释器跑文件,不需要执行权限;./hello.sh 是把文件当可执行程序跑,靠 shebang 找解释器,需要执行权限。生产脚本一般加执行权限,方便直接 ./ 跑或放进 PATH 里当命令用。
四、shebang 的写法
shebang(#!)写在脚本第一行,指定解释器。两种写法:
| 写法 | 特点 |
|---|---|
#!/usr/bin/env bash | 从 PATH 找 bash,可移植性好 |
#!/bin/bash | 路径明确,但某些发行版 bash 不在 /bin/bash |
推荐 #!/usr/bin/env bash——可移植性好。注意别误写成 #!/bin/sh:sh 在不同系统上指向不同(有的是 bash 的兼容模式,有的是 dash),行为可能不一致。脚本里用了 bash 特性(数组、[[ ]] 等),shebang 就得写 bash,不能写 sh。
五、脚本为什么比命令行强
到这里,脚本能跑、能串命令、能加执行权限。但脚本真正比命令行强的地方还没体现——它能加判断、循环、错误处理。
后面的篇章依次讲这些:变量和引号、条件判断、循环、函数,把脚本从"一串命令的记录"变成"能做决策的程序"。本系列的目标是让读者能写出可用的运维脚本——巡检、备份、批量操作、初始化,这些日常重复的事交给脚本自动跑。