Linux 命令实战 · 第 9 章 Shell 脚本与组合艺术


文档摘要

Linux 命令实战 · 第 9 章 Shell 脚本与组合艺术 章节摘要:这是全书最后一章,也是一座桥——从「会敲命令」跨到「会造工具」。当你发现自己在反复敲同一串命令,就该把它写成脚本了。Shell 脚本的本质,是把前八章学的命令用「变量、条件、循环、函数」串成可复用的程序。本章不追求教你写「一千行的企业级 Shell 工程」,而是讲清日常工程中最有用的那部分:变量与各种展开、 与条件判断、 / 循环、函数、以及三个让你的脚本「健壮到能上线」的关键写法—— (遇错即停 + 拒绝未定义变量 + 管道失败穿透)、 (优雅处理信号与清理)、 (规范解析命令行参数)。读完本章,你能把重复劳动固化成一个带参数、有错误处理、能被 定时调用的脚本工具。

Linux 命令实战 · 第 9 章 Shell 脚本与组合艺术

章节摘要:这是全书最后一章,也是一座桥——从「会敲命令」跨到「会造工具」。当你发现自己在反复敲同一串命令,就该把它写成脚本了。Shell 脚本的本质,是把前八章学的命令用「变量、条件、循环、函数」串成可复用的程序。本章不追求教你写「一千行的企业级 Shell 工程」,而是讲清日常工程中最有用的那部分:变量与各种展开、test 与条件判断、for/while 循环、函数、以及三个让你的脚本「健壮到能上线」的关键写法——set -euo pipefail(遇错即停 + 拒绝未定义变量 + 管道失败穿透)、trap(优雅处理信号与清理)、getopts(规范解析命令行参数)。读完本章,你能把重复劳动固化成一个带参数、有错误处理、能被 cron 定时调用的脚本工具。而当你写 Shell 脚本写到「想让这个脚本语言本身变得更好用」时,那就到了姊妹篇《造轮子工程》第 2 章「造一个 Shell」的入口。

学习目标

阅读完本章,你应当能够:

  1. 说清 Shell 脚本的定位:它最适合「编排命令」,不适合「复杂算法」,理解何时该用脚本、何时该换 Python。
  2. 熟练使用变量与四种展开(参数展开、命令替换、算术展开、波浪号与路径展开),理解它们都在命令执行之前由 Shell 完成。
  3. test/[[[ ]] 做条件判断,理解 [[ ]](Shell 内建)比 [(外部命令)更强、更安全。
  4. for/while/until 处理循环,掌握 for x in listfor ((i=0; i<n; i++)) 两种形式。
  5. 定义与调用函数,理解参数($1/$2/$@)与返回值(退出码)的机制。
  6. 写出带 set -euo pipefail 的防御性脚本,说清这三/四个选项各防的是什么错。
  7. trap 捕获信号与退出,实现「脚本中途 Ctrl+C 也能清理临时文件」的健壮逻辑。
  8. getopts 解析命令行选项,给你的脚本配上规范的 -h-v、参数说明。

核心概念速览

Shell 脚本的核心价值不是「图灵完备」,而是「把命令组合成工具」的最低成本方式——set -euo pipefail + trap + getopts 这三件套,是业余脚本与生产脚本的分水岭。

子章节导航

01 从命令到脚本:变量与展开

把一行命令变成脚本的起点是变量。讲清变量赋值(x=5,注意等号两边不空格)、四种展开($x 参数展开、$(cmd) 命令替换、$((...)) 算术、~ 路径),强调「展开在命令执行之前由 Shell 完成」——这解释了为什么引号至关重要。

02 条件判断:test[[[ ]]

test[(同一事物的两种写法)、[[ ]](更强的 Bash 内建)。讲清字符串比较(=/!=)、数值比较(-eq/-lt)、文件判定(-f/-d/-e)、[[ ]] 支持 &&/|| 与模式匹配的优势。

03 循环:forwhileuntil

for x in list(遍历列表)、for x in *.txt(遍历文件)、for ((i=0; i<n; i++))(C 风格数值循环)、while cond(条件为真时循环)、until cond(条件为假时循环)。配 break/continue

04 函数:让命令可复用

函数定义(name() {...}function name {...})、调用与参数($1/$2/$@/$#)、返回值用退出码(return)、变量作用域(默认全局,local 限制)。讲清「函数是脚本里的脚本」这个心智模型。

05 健壮性第一件:set -euo pipefail

三个选项各防一种错:-e(遇错即停,不让错误滚雪球)、-u(用未定义变量即报错,防拼写错)、-o pipefail(管道中任一段失败则整体失败,默认只看最后一段)。讲清为何几乎所有生产脚本都该加这行。

06 健壮性第二件:trap 信号与退出清理

trap 'cleanup' EXIT INT TERM 让脚本在退出(无论正常/异常/Ctrl+C)时执行清理。经典用法:开头建临时目录、trap 里删它,保证「哪怕中途失败也不留垃圾」。

07 健壮性第三件:getopts 与参数解析

getopts 是 Bash 内建的参数解析器,支持短选项(-a-b value)。讲清它的用法与局限(不支持长选项 --help),以及如何用它给脚本配上规范的 usage() 帮助文本。

08 综合实战:一个可上线的备份脚本

把前七节串起来,写一个完整的「带参数、有错误处理、能定时跑、遇 Ctrl+C 会清理」的备份脚本:接收源目录与目标路径参数、用 rsync 增量同步、trap 清理临时锁文件、set -euo pipefail 保证出错即停。这是全章的综合应用题。

子章节之间的逻辑关系

本章遵循「语法 → 控制流 → 健壮性 → 实战」的递进路径,前三节是语法,中间三节是健壮性,最后是综合:

变量与展开 (01) ── 脚本的"细胞" │ ▼ 条件判断 (02) ── 控制流之"分支" │ ▼ 循环 (03) ── 控制流之"重复" │ ▼ 函数 (04) ── 组织代码的"积木" │ ▼ set -euo (05) ── 健壮性①:遇错即停 │ ▼ trap (06) ── 健壮性②:信号清理 │ ▼ getopts (07) ── 健壮性③:规范参数 │ ▼ 综合备份脚本 (08) ── 全章综合应用 │ ▼ 姊妹篇《造轮子工程》第 2 章:从"写脚本"上升到"造一个 Shell"

前四节是「语法与控制流」,让你能把命令组合成程序;5-7 节是「健壮性三件套」,这是业余脚本与生产脚本的分水岭,也是本章真正的核心价值;第 8 节是综合检验。整章是「会用命令→会写脚本→会造工具」这条上升路径的中间环节。

前置知识与后续延伸

前置知识:

  • 第 1 章(展开规则、退出码、标准流——脚本的每一行都建立其上)
  • 第 3 章(管道组合——脚本里最常用的编排方式)
  • 其余各章的命令——脚本就是把这些命令用控制流串起来

本章为后续章节奠定的基础:

  • 脚本能力让你把前八章的命令固化成可复用工具
  • set -euo pipefail + trap + getopts 是生产环境的必备素养
  • 本章是姊妹篇《造轮子工程》的直接入口——「想造一个比 Bash 更好用的 Shell」
  • 「变量展开、条件、循环、函数」这套控制流原语,正是任何编程语言的核心;在姊妹篇里你会从零再造一套

发布者: 作者: 灏天文库 转发
评论区 (0)
U