当前位置: 首页 > news >正文

Shell脚本-条件判断语法格式

一、前言

在 Linux 系统中,Shell 脚本是系统管理、自动化任务和运维工作中不可或缺的工具。而条件判断是 Shell 脚本中最核心的控制结构之一,它决定了程序的执行流程,让脚本具备“智能”判断能力。

本文将全面讲解 Shell 脚本中条件判断的语法格式,包括 test 命令、[ ][[ ]](( )) 四种常见形式,并结合实际示例帮助你掌握其使用方法和注意事项。

二、Shell 条件判断的四种语法格式

Shell 中有四种常用的条件判断写法,它们各有特点,适用于不同场景。

1. 使用 test 命令

test 是最基础的条件判断命令,语法如下:

test 表达式

示例:

#!/bin/bash
if test 10 -gt 5; thenecho "10 大于 5"
fi

✅ 特点:兼容性好,适用于所有 POSIX 标准的 shell。

2. 使用 [ ](中括号)

这是 test 命令的等价写法,更常见于脚本中:

[ 表达式 ]

注意: 中括号与表达式之间必须有空格!

示例:

#!/bin/bash
num=20
if [ $num -eq 20 ]; thenecho "数值相等"
fi

✅ 特点:简洁,广泛使用。
⚠️ 注意:[ ] 不支持正则表达式和通配符匹配。

3. 使用 [[ ]](双中括号)—— 推荐使用

[[ ]] 是 Bash 的扩展语法,功能更强大,支持字符串模式匹配、逻辑运算符 &&|| 等。

[[ 表达式 ]]

示例:

#!/bin/bash
name="alice"
if [[ $name == "alice" ]]; thenecho "用户名正确"
fi# 支持通配符
if [[ $name == a* ]]; thenecho "名字以 a 开头"
fi

✅ 特点:

  • 支持 &&||! 逻辑运算符
  • 支持 ==!= 字符串匹配(支持通配符)
  • 不需要对变量加引号(但仍建议加)

⚠️ 注意:[[ ]] 仅在 Bash、Zsh 等现代 shell 中可用,不适用于 sh

4. 使用 (( ))(双小括号)—— 数值计算专用

(( )) 用于数值比较和算术运算,语法更接近 C 语言。

(( 表达式 ))

示例:

#!/bin/bash
a=10
b=5
if (( a > b )); thenecho "a 大于 b"
fi# 支持复合运算
if (( a > 5 && b < 10 )); thenecho "条件成立"
fi

✅ 特点:

  • 专用于数值判断
  • 支持 ><>=<===!=&&|| 等
  • 写法简洁,无需使用 -gt-lt 等参数

三、常用条件判断类型

1. 数值比较

运算符含义示例
-eq等于[ 5 -eq 5 ]
-ne不等于[ 5 -ne 3 ]
-gt大于[ 5 -gt 3 ]
-ge大于等于[ 5 -ge 5 ]
-lt小于[ 3 -lt 5 ]
-le小于等于[ 3 -le 5 ]

💡 使用 (( )) 时可用 >, <, == 等符号。

2. 字符串比较

运算符含义示例
= 或 ==等于[ "a" = "a" ]
!=不等于[ "a" != "b" ]
-z字符串为空[ -z "" ]
-n字符串非空[ -n "hello" ]

示例:

str=""
if [ -z "$str" ]; thenecho "字符串为空"
fi

✅ 建议:字符串变量使用双引号包围,防止空值导致语法错误。

3. 文件测试

运算符含义示例
-f file是否为普通文件[ -f /etc/passwd ]
-d dir是否为目录[ -d /tmp ]
-e file是否存在[ -e /bin/bash ]
-r file是否可读[ -r file.txt ]
-w file是否可写[ -w file.txt ]
-x file是否可执行[ -x script.sh ]

示例:

if [ -f "/etc/hosts" ]; thenecho "hosts 文件存在"
fi

四、逻辑运算符

运算符说明用法
&&逻辑与[[ 条件1 && 条件2 ]]
``
!逻辑非[[ ! 条件 ]]

⚠️ 注意:

  • [ ] 中需使用 -a(与)、-o(或),不推荐使用。
  • 推荐使用 [[ ]] 配合 && 和 ||,更清晰易读。

五、实战示例:判断文件是否存在并可读

#!/bin/bash
filename="data.txt"if [[ -f "$filename" && -r "$filename" ]]; thenecho "文件存在且可读,开始处理..."cat "$filename"
elseecho "文件不存在或不可读!"exit 1
fi

六、常见错误与注意事项

错误原因解决方法
缺少空格[ $var=5 ]正确写法:[ $var = 5 ]
变量未加引号$var 为空时报错使用 "$var"
使用 [ ] 写复杂逻辑不支持 &&、`
在 sh 中使用 [[ ]]兼容性问题改为 [ ] 或使用 bash 执行

七、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.dtcms.com/a/324366.html

相关文章:

  • React Profiler
  • 【代码随想录day 15】 力扣 404. 左叶子之和
  • 【无标题】命名管道(Named Pipe)是一种在操作系统中用于**进程间通信(IPC)** 的机制
  • Ubuntu 安装 Elasticsearch
  • Ubuntu 安装 Kibana
  • WGS84 与 ITRF 坐标系的差异及转换算法详解
  • 进程状态+进程优先级+进程上下文切换解读
  • 不同hash加密类型的hashfile.txt文件
  • C# 中常用集合以及使用场景
  • 强制类型转换
  • AI 对齐:让人工智能与人类价值同频共振
  • JavaWeb——maven高级(5/5)-私服(私服的概念与作用、Maven 依赖的查找顺序、上传资源到私服的配置步骤、下载依赖配置条件)
  • 单链表专题---暴力算法美学(2)(有视频演示)
  • actuary notes[2]
  • 单调栈——数位删减
  • Go语言中切片(Slice)的拷贝
  • 自创论述类文本阅读:论温泉
  • PWM波的频谱分析及matlab 验证[电路原理]
  • 【Linux】使用静态 BusyBox 解决操作系统“塌方”问题
  • Premiere准备工作
  • AQS的详细讲解
  • Java对接支付宝,回调验签失败
  • 活动策划(展会、年会),在线工具能快速出邀请函不?
  • [创业之路-537]:经营分析会 - 销售目标以及支撑、关键策略、主要行动措施、资源保障、人才储备
  • 在 JDK 17 上完整观察 synchronized 锁升级过
  • 嵌入式第二十四课!!linux应用软件编程与文件操作!!!
  • Java 基础编程案例:斐波拉契数与从输入交互到逻辑处理
  • NodeJs学习日志(4):路由合并_环境配置_常用文件目录
  • HarmonyOS之module.json5功能详解
  • AI测试助手如何让Bug无处可藏