Bash
学习 Bash 脚本编程,从变量到健壮的生产级脚本。涵盖循环、数组、信号捕获、set -euo pipefail 以及服务器引导启动实战项目。
共 12 节,按顺序
- 120 分钟
什么是 Bash
欢迎。如果你这辈子从没打开过终端,那你来对地方了。在敲下第一条命令之前,我们要先花十分钟把两件事弄清楚:Bash 究竟是什么,以及此刻屏幕上摆着的到底是什么东西。人们成天把"终端"、"外壳程序"和"Bash"混作一谈,而这种混淆会让后面的一切都比本来更难。
Shell vs terminalBash vs sh vs zshInteractive shell vs scriptWhere Bash fits in DevOps - 225 分钟
Shebang 与你的第一个脚本
如果“脚本”这个词听上去还像是只有真正的程序员才写得出的东西,别紧张。脚本无非是一个文本文件,里面列着一串命令,而读完这一课,你就会写出一个、跑起来,并且完全明白它为什么能跑。这里没有一处需要编程经验。
Shebang#!/usr/bin/env bashChmod +x./script.sh vs bash script.shExit codes - 325 分钟
变量与引号
如果你从来没用过变量,不用担心。它是整门课里最简单的概念之一,而 Bash 的这一套差不多是最朴素的写法了。这一课还会讲引号,几乎每个人都会在引号上栽一次跟头,而一旦想通了,就再也不会栽第二次。
Variable assignmentDouble quotes vs single quotes${var} bracesCommand substitution $(...) - 430 分钟
条件语句与测试
到目前为止你写的每个脚本,不管遇到什么情况都照着同样几行跑。真实的脚本需要做决定:"只有当这个文件存在时才做这件事"、"只有上一条命令成功了才继续"。这一课教你 Bash 怎么提出这些问题,又怎么根据答案行动。这里不假设你以前写过任何会做判断的程序。
If statement[[ ]] testsString testsFile tests -f -d -e&& and ||Case statement - 525 分钟
循环
到目前为止,你写的每个脚本都是从上到下,每一行只跑一次。脚本短的时候这没问题,可真实的工作总是重复的:重命名五十个文件、检查十台服务器、给名单上的每个人打一句招呼。把同一条命令敲五十遍,这不叫办法。循环是一段被 Bash...
For loopWhile loopUntil loopFor f in *.txt globbingC-style for loopBreak and continue - 625 分钟
函数
写到现在,你的脚本已经开始出现重复了。也许你在三个不同的地方打印带时间戳的日志,又或者每次改动文件之前都要检查它是否存在,同样的三行代码反复出现。复制粘贴当然管用,直到有一天你要修掉其中的一个缺陷,才发现同一处修改要在五个地方各做一遍。Bash 对此给出的答案,和所有语言给出的答案是一样的:...
Function definitionPositional args $1 $@ $#Return for exit codesEcho for outputLocal variables - 725 分钟
数组
到目前为止,一个变量只装一个值。name="Ada" 装的是一个字符串。如果你想装三个名字,要么得准备 name1、name2、name3 三个独立的变量,要么把它们用空格拼进一个字符串,然后祈祷其中任何一个名字里都别自带空格。一旦列表超过两三项,这两种办法都算不上好主意。Bash...
Indexed arrays${arr[@]}${#arr[@]} lengthAssociative arrays declare -AIterating arrays - 825 分钟
字符串与算术展开
你会不断遇到这样的情况:手里的变量装着的东西,跟你要的差那么一点点。你要的是文件名,它给的是完整路径。你要的是扩展名,它给的是文件名。一句话里只有一个词需要换掉。报告里要用的两个数字,得先加起来。这些事你都可以交给 sed、awk 这样的外部程序去做,有时候也确实该这么做,但 Bash...
${var#prefix}${var%suffix}${var//old/new}$(( arith ))Printf formatting - 925 分钟
IO 重定向与管道
你在 Bash 里运行的每一条命令, 底层都接着三条各自独立的通道, 不管你有没有察觉到。可以想象一台信件分拣机: 信从一个投口进去, 分拣成功的信从一个出口出来, 破损或者无法投递的信被推到另一个单独的托盘里, 免得混进好信里面。Bash 给每条命令的都是这样一套三通道结构,...
>>><2>2>&1&>+3 - 1030 分钟
错误处理与 trap
到目前为止你写的每个脚本,都默认事情会顺顺利利。找不到文件的命令、不存在的目录、变量名里的一个拼写错误:按默认设置,Bash 对这些一律耸耸肩,照样接着跑下一行。你在提示符前随手试东西的时候,这样没什么问题;但对一个要安装软件、删除文件、配置服务器的脚本来说,这恰恰是最要命的行为,因为出错之后还一头...
Set -eSet -uSet -o pipefailTrap on EXITTrap on ERRCleanup functions - 1125 分钟
调试与最佳实践
迟早有一天,你写的脚本会做出你没让它做的事。它删错了文件,跳过了你确信一定会跑的循环,或者一声不响地产出一个空结果。你一行一行读过去,觉得写得没毛病,可离答案还是一样远。问题几乎从来不是 Bash 坏了。问题在于 Bash 在执行之前会先把你的命令改写一遍,把变量和通配符 (glob)...
Bash -xSet -xShellcheckSafe quotingNever parse ls[[ vs [+1 - 1260 分钟
综合实战:服务器引导脚本
一台全新的服务器,就是一台上面什么都没有的机器。总得有人去装 web 服务器、建好你登录用的账户、把 SSH 公钥放到位、再安排好那些告诉你机器还健康的检查。手动做完这些要二十分钟,而且做出来的机器没人能复现,因为确切的操作顺序只存在于你的终端历史里。写成脚本能解决这个问题,但前提是这个脚本经得起再...
Idempotent provisioningInstalling packagesCreating usersSSH key setupSystemd timersLogging+2
用你的语言学习 Bash
每一节课、测验和导师回复都以你的语言显示。AI 导师会用你提问的语言来回答。
Roles that use Bash
See how hiring teams interview engineers on Bash, in production-like environments.
DevOps Engineer
Hire DevOps engineers who actually ship. Run live or take-home interviews in production-like Linux environments with Docker, Kubernetes, Terraform and CI/CD. See how they debug, automate, and work alongside AI.
See the interviewSite Reliability Engineer (SRE)
Hire SREs who actually run production. Live workspaces with metrics, logs, traces and a service that is starting to misbehave. We record every keystroke.
See the interviewInfrastructure Engineer
Hire infrastructure engineers who design systems your team can rely on. Interview them in real workspaces with Terraform, Ansible, cloud APIs and live failure scenarios.
See the interview