简介:本文面向零基础开发者,系统梳理 Shell 脚本的入门路径。内容涵盖 Shell 命令的标准结构、内置命令与外部命令的区别、常用符号的语义与组合用法,以及脚本从创建、赋权到三种执行方式的完整流程。读完即可独立编写并运行基础脚本,为后续自动化运维与批量任务处理打下扎实基础。
Shell 脚本是开发者与 Linux/Unix 系统交互的基本功。无论是日常的文件操作、批量任务处理,还是构建自动化流水线,Shell 脚本都扮演着不可替代的角色。本文将从最基础的命令结构讲起,逐步过渡到常用符号、脚本创建与执行方式,帮助你建立一套完整、可复用的入门知识框架。
在编写脚本之前,必须先理解一条 Shell 命令由哪些部分组成。绝大多数命令都遵循一个统一的模式:
命令 [选项] [参数]
这三部分各司其职:
ls、cd、grep、find 等。它决定了这条命令“做什么”。-(短选项)或 --(长选项)开头,例如 -l、--help。选项决定了命令“怎么做”。/home、config.yaml。参数决定了命令“对谁做”。以 ls -l /home 为例:ls 是命令,-l 是选项(表示以详细列表形式显示),/home 是参数(要列出的目录)。三者组合,表达的完整语义是“以详细列表形式列出 /home 目录的内容”。
理解这个结构的意义在于:当你阅读任何命令的手册或示例时,都能快速拆解出它的组成部分,并据此调整选项与参数,而不是机械地复制粘贴。选项与参数之间、多个选项之间通常用空格分隔,短选项在多数命令中可以合并书写(如 -l -a 常写作 -la),这也是阅读他人脚本时常见的写法。
Shell 中可用的命令来源并不相同,理解它们的区别有助于排查问题、理解脚本行为。
内置命令由 Shell 自身直接提供,不依赖外部可执行文件,例如 cd、echo、exit、export。它们的特点是执行速度快,且往往能够修改当前 Shell 自身的状态——这正是 cd 必须作为内置命令的原因:如果 cd 是一个外部程序,它只能改变自己进程的工作目录,而无法影响调用它的 Shell。
外部命令是独立的可执行程序,存放在系统的可执行路径中,例如 ls、grep、find、python。执行外部命令时,Shell 会创建子进程来运行它,因此它无法直接改变父 Shell 的环境。
别名是用户自定义的命令缩写,本质上是为常用命令组合起一个短名字,例如把 ls -l 定义为别名 ll。别名在交互式使用中能显著提升效率,但在脚本中通常不建议依赖别名,因为脚本执行环境未必加载了相同的别名配置,容易造成行为不一致。
区分这三类命令的实际价值在于:当你在脚本中发现某条命令“没有按预期生效”时,可以先判断它是内置命令还是外部命令,再进一步检查路径、权限或环境配置。
Shell 中有一批特殊符号,它们构成了脚本的逻辑骨架。掌握这些符号,才能写出有判断、有流程的脚本,而不只是命令的简单堆砌。
注释与命令分隔
#:注释符号,其后的内容会被 Shell 忽略,用于给脚本添加说明。;:命令分隔符,让多条命令按顺序依次执行,无论前一条是否成功。逻辑控制
&&:前一个命令成功(退出状态为 0)时才执行后一个命令,适合表达“满足条件才继续”的语义。||:前一个命令失败(退出状态非 0)时才执行后一个命令,常用于兜底处理。这两个符号可以组合使用,形成简洁的条件逻辑,是脚本中替代部分 if 判断的常用手法。
数据流控制
|:管道符,把前一个命令的输出作为后一个命令的输入,是组合小工具完成复杂任务的核心机制。>:将输出重定向到文件,覆盖原有内容。>>:将输出重定向到文件,追加到末尾。<:从文件重定向输入。进程与匹配
&:将命令放到后台运行,不阻塞当前终端。*:通配符,匹配任意长度的任意字符。?:通配符,匹配单个字符。{}:用于生成序列或组合命令,例如批量创建带编号的文件名。引用与替换
$:引用变量或进行命令替换,是最常用的展开符号。'...'(单引号):引号内内容原样输出,不解析变量。例如 echo '$HOME' 会输出字面量 $HOME。"..."(双引号):引号内会解析变量和特殊字符。例如 echo "$HOME" 会输出当前用户的主目录路径。`...` (反引号):用于命令替换,但现代写法已普遍改用 $(),后者嵌套更清晰、可读性更好。单引号与双引号的区别是初学者最容易踩坑的地方:需要保留字面量时用单引号,需要展开变量时用双引号。在脚本中养成“变量引用一律加双引号”的习惯,可以有效避免路径含空格或变量为空时引发的意外错误。
掌握了命令结构与符号之后,就可以动手写脚本了。一个 Shell 脚本本质上就是一个包含一系列命令的文本文件。
第一步:创建脚本文件
通常以 .sh 作为扩展名,并在首行写入 Shebang,指明用哪个解释器执行该脚本:
#!/bin/shecho "Hello, World!"
Shebang 行以 #! 开头,是脚本能被系统识别为可执行程序的关键。
第二步:赋予执行权限
新建的文本文件默认没有执行权限,需要使用 chmod 添加:
chmod +x example.sh
第三步:选择执行方式
脚本有三种常见执行方式,适用场景各不相同:
./example.sh 运行。这是最贴近“程序”语义的方式,系统会依据 Shebang 启动对应解释器。bash example.sh 或 sh example.sh。这种方式不要求脚本具备执行权限,适合临时调试或在不便修改权限的环境中运行。source example.sh 或 . example.sh。它不会创建新的子 Shell,而是在当前 Shell 环境中逐行执行脚本,因此脚本中定义的变量和函数会保留在当前会话中。这一特性在加载环境配置、定义常用函数时非常有用,但也意味着脚本中的 cd、变量修改会直接影响当前终端,使用时需格外注意。区分这三种方式的关键在于理解“是否创建子进程”以及“是否依赖执行权限”。直接执行与通过解释器执行都会启动新的子进程,脚本中的环境变更不会影响父 Shell;而 source 方式则在当前进程中执行,环境变更会持续生效。
掌握上述内容,已经足以读懂并编写基础脚本。要进一步进阶,建议按以下方向逐步深入:
if、case、for、while 等控制结构,使脚本能够根据条件做出判断、对批量对象重复处理。set -e、set -x 等选项控制脚本行为并辅助排查问题。Shell 脚本的学习曲线并不陡峭,但真正的熟练来自持续的动手实践。建议从解决身边的小问题开始——批量重命名文件、定时清理临时目录、封装常用命令组合——在实践中不断巩固命令结构与符号语义,逐步建立起自己的脚本工具箱。