Skip to content

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 脚本的强项是串联系统命令:调 dfgrepawkcurl,把它们用管道和重定向串起来处理文本和系统状态。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.sh
text
hello shell
当前用户: root
当前目录: /root

脚本跑起来了。但每次都要写 bash hello.sh 不方便,想直接 ./hello.sh 跑,得加执行权限:

bash
chmod +x hello.sh
./hello.sh
text
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/shsh 在不同系统上指向不同(有的是 bash 的兼容模式,有的是 dash),行为可能不一致。脚本里用了 bash 特性(数组、[[ ]] 等),shebang 就得写 bash,不能写 sh。

五、脚本为什么比命令行强

到这里,脚本能跑、能串命令、能加执行权限。但脚本真正比命令行强的地方还没体现——它能加判断、循环、错误处理。

后面的篇章依次讲这些:变量和引号、条件判断、循环、函数,把脚本从"一串命令的记录"变成"能做决策的程序"。本系列的目标是让读者能写出可用的运维脚本——巡检、备份、批量操作、初始化,这些日常重复的事交给脚本自动跑。