Shell结构化命令完整学习笔记

📅 2026/7/11 6:46:35 👁️ 阅读次数 📝 编程学习
Shell结构化命令完整学习笔记

在Shell脚本编写过程中,结构化命令是实现程序逻辑分支、条件判断的核心工具,能够让脚本根据不同执行结果、数据内容、文件状态自动选择执行流程,摆脱命令顺序执行的单一模式,也是Linux自动化脚本开发的基础内容。

最基础的结构化逻辑由if-then语句构成,和其他编程语言的if判断逻辑存在本质区别,Shell中的if并不会直接判断等式真假,而是会执行if后方跟随的完整命令,依靠这条命令的退出状态码决定分支走向。当命令执行正常,退出状态码为0时,then区块内的所有指令会被执行;若命令执行失败,返回非0状态码,系统会直接跳过then中的代码,向后继续读取脚本内容。同时语法支持简写形式,通过分号分隔命令,将then与if写在同一行,简化代码排版,两种书写方式执行效果完全一致。

单纯的if-then只能处理命令执行成功的场景,无法对执行失败的情况做出响应,if-then-else语句补足了这一短板,当if后的命令运行异常时,程序会自动跳转至else区块执行预设指令,实现两种结果的分支处理。如果业务场景存在三种及以上判断情况,重复嵌套if会让代码冗余杂乱,elif关键字可以无缝延续else分支,串联多层判断条件,依次匹配不同场景,完成多分支逻辑编写,让代码结构更加简洁清晰。

if语句仅能识别命令的退出码,无法直接对数字、文本、文件状态做对比,test命令填补了这一空白,它专门用于自定义条件检测,条件成立时返回0,条件不成立返回非0值,完美适配if分支逻辑。test拥有两种书写形式,完整书写为test加条件,简写形式使用方括号替代,使用方括号时必须保证括号和内部条件之间保留空格,缺少空格会直接报语法错误。test能够覆盖三类高频判断场景,分别是数值比较、字符串比较、文件状态比较。

数值比较仅支持整数运算,无法识别浮点小数,一旦传入小数数值执行对比,脚本会直接抛出整数表达式预期的报错信息。内置多组对比参数,可完成相等、大于、大于等于、小于、小于等于、不相等的数值校验,满足基础数字逻辑判断需求。

字符串对比会严格区分大小写、标点符号,完全按照字符原始内容匹配;判断字符串大小顺序时,大于、小于符号需要添加转义符,排序规则和sort命令相反;内置-n、-z两个参数专门检测字符串长度,-n判断字符串长度不为空,-z判断字符串为空,常用于变量前置校验,避免空变量引发脚本异常。

文件状态检测可以读取Linux文件系统的文件、目录属性,能够判断目标路径是否存在、是普通文件还是文件夹、文件是否可读、可写、可执行,同时支持校验文件归属用户、用户组,还能对比两个文件的创建修改时间,判断文件新旧,在日志、配置文件自动化处理脚本中使用频率极高。

单条test条件只能完成单一校验需求,复合条件测试借助布尔逻辑实现多条件同时判断,两种逻辑运算符分别为逻辑与、逻辑或。逻辑与要求前后两组test条件全部成立,整体判断结果才为真;逻辑或仅需要任意一组条件成立,整体判断结果即为真,多条件组合时每组测试条件需要独立使用方括号包裹。

基础test仅能完成简单对比运算,双括号与双方括号提供了更强大的拓展能力。双括号用于高级数学表达式运算,支持自增、幂运算、位移、逻辑运算等复杂数学操作,内部大于、小于符号无需额外转义,算术相关判断优先选择双括号语法。双方括号侧重字符串模式匹配,相比普通方括号语法容错性更高,专门用于复杂文本匹配场景,规避普通字符串对比容易出现的语法漏洞。

在实际脚本开发中,各类结构化命令可以互相嵌套使用,在if内部再次编写完整的if判断语句,实现多层级逻辑校验,结合文件检测、数值对比、复合条件、高级括号运算,能够搭建完整、健壮的自动化脚本。实操时通过终端直接生成脚本文件,赋予执行权限后运行查看输出,浮点数值对比报错、多层分支输出、文件状态检测结果都可以作为实操截图素材,完整记录每一类语法的运行效果,梳理成完整的知识体系,清晰区分各类判断语法的适用场景、参数用法与使用注意事项,方便后续快速查阅复用。