【Linux 】Shell条件语句全面整理

张开发
2026/4/13 17:49:34 15 分钟阅读

分享文章

【Linux 】Shell条件语句全面整理
Linux Shell条件语句全面整理一、基础测试命令1.test命令# 基本语法test表达式# 或test-ffile.txt# 返回值# 条件为真时返回0为假时返回非0testabcabcecho$?# 输出0真# 常用操作符# 字符串, !, -z, -n# 文件-e, -f, -d, -r, -w, -x# 数值-eq, -ne, -lt, -le, -gt, -ge2.[ ]单方括号# test命令的另一种形式注意空格[表达式][$a-eq$b]# 示例a10b20if[$a-lt$b];thenechoa小于bfi3.[[ ]]双方括号# bash的扩展测试命令功能更强大[[表达式]]# 示例if[[$strhello]];thenecho字符串匹配fi4.(( ))双括号# 专门用于数值计算和比较((算术表达式))# 示例a5b10if((ab));thenechoa小于bfi二、详细用法对比字符串比较操作test/[ ][[ ]]说明相等$a $b$a $b[[ ]]中是模式匹配不等$a ! $b$a ! $b为空-z $a-z $a检查空字符串非空-n $a-n $a检查非空字符串模式匹配不支持[[ $a a* ]]支持通配符正则匹配不支持[[ $a ~ ^a.* ]]支持正则表达式数值比较操作test/[ ](( ))[[ ]]说明等于$a -eq $ba ba -eq b不等于$a -ne $ba ! ba -ne b小于$a -lt $ba ba -lt b小于等于$a -le $ba ba -le b大于$a -gt $ba ba -gt b大于等于$a -ge $ba ba -ge b文件测试测试条件说明三种语法通用-e file文件/目录是否存在✓-f file是否为普通文件✓-d file是否为目录✓-r file是否可读✓-w file是否可写✓-x file是否可执行✓-s file文件大小是否0✓-L file是否为符号链接✓-O file是否属于当前用户✓逻辑运算符运算符test/[ ][[ ]](( ))说明与-a或(需转义)或-o或||(需转义)||||非!!!分组不支持( )( )三、关键注意事项[ ]使用陷阱# 1. 必须加空格[$a$b]# ✓ 正确[$a$b]# ✗ 错误# 2. 变量必须用引号包围strhello world[-n$str]# ✗ 可能出错参数过多[-n$str]# ✓ 正确# 3. 字符串比较用而不是[$a$b]# ✓ 正确POSIX标准# 4. 不支持和||只能-o和-a[$ayes-a$bno]# ✓[$ayes$bno]# ✗需要转义\\# 5. 不支持正则和模式匹配[[ ]]优点和注意点# 1. 变量可不加引号不会分词strhello world[[-n$str]]# ✓ 安全# 2. 支持和||[[$ayes$bno]]# ✓# 3. 支持模式匹配[[$file*.txt]]# ✓[[$name[A-Z]*]]# ✓# 4. 支持正则表达式[[$email~^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$]]# ✓# 5. 字符串比较可用或[[$a$b]]# ✓在[[ ]]中是字符串比较# 注意是bash扩展其他shell可能不支持(( ))专用特性# 1. 专门用于算术运算((a53))# ✓ 赋值((a))# ✓ 自增((resulta*b))# ✓ 计算# 2. 变量可不加$前缀a5b10((ab))# ✓ 等同于(( $a $b ))# 3. 支持C语言风格的运算符((a5))# ✓((ab5?10:20))# ✓ 三元运算符# 4. 返回值表达式为0时返回1假非0时返回0真((0))# 返回1假((1))# 返回0真((53))# 返回0真四、综合对比表特性test/[ ][[ ]](( ))Shell支持POSIX标准所有shellbash、zsh等bash、zsh等变量引号必须加引号可不加引号可不加引号字符串比较或!、!、模式匹配不支持数值比较-eq、-ne等-eq、-ne等或、等、!、、等模式匹配不支持支持、!不支持正则表达式不支持支持~不支持逻辑运算符-a、-o、!、||、!、||、!算术运算不支持有限支持完整支持安全性容易出错分词、路径扩展安全不分词、不扩展安全推荐使用场景可移植脚本bash脚本优先使用数值计算和比较五、实用示例组合使用示例#!/bin/bashfiletest.txtcount5nameexample# 复杂的条件判断if[[-f$file-r$file]]((count0));thenecho文件存在、可读且count大于0if[[$name~^ex.*]];thenecho名称以ex开头fifi# 多条件判断a10b20strhelloif((ab))[[$strhello]];thenecho数值比较和字符串比较都通过fi# case语句中的模式匹配case$filein*.txt)echo文本文件;;*.sh)echoshell脚本;;*)echo其他文件;;esac最佳实践建议bash脚本中优先使用[[ ]]更安全功能更全需要可移植时使用[ ]但要注意引号和空格数值计算和比较使用(( ))语法更直观总是用引号包围[ ]中的变量复杂条件用[[ ]]的、\|\|代替-a、-o文件测试三种语法都可用选择一致风格常见错误避免# 错误示例[$vartest]# var为空时会变成 [ test ][[$vartest]]# 稍好但最好还是加引号[-f$file]# file包含空格时出错# 正确写法[-n$var]# 检查非空[$vartest]# 变量加引号[[-f$file]]# 即使[[ ]]中不加引号通常安全但文件路径最好加通过理解这些差异和最佳实践可以编写更健壮、可读性更强的shell脚本。

更多文章