一、条件判断语法结构
1.1 条件判断语法格式
- 格式1:test 条件表达式
- 格式2: [ 条件表达式 ]
- 格式3: [[ 条件表达式 ]]
注意:如何使用格式2或格式3,条件表达式两侧必须有空格!
1.2 条件判断相关参数
1)判断文件类型
判断参数 |
含义 |
-e |
判断文件是否存在(任何类型文件) |
-f |
判断文件是否存在并且是一个普通文件 |
-d |
判断文件是否存在并且是一个目录 |
-L |
判断文件是否存在并且是一个软连接文件 |
-b |
判断文件是否存在并且是一个块设备文件 |
-S |
判断文件是否存在并且是一个套接字文件 |
-c |
判断文件是否存在并且是一个字符设备文件 |
-p |
判断文件是否存在并且是一个命名管道文件 |
-s |
判断文件是否存在并且是一个非空文件(有内容) |
举例:
| $ test -e file;echo $? 只要文件存在条件为真 |
| $ [ -d /shell01/dir1 ];echo $? 判断目录是否存在,存在条件为真 |
| $ [ ! -d /shell01/dir1 ];echo $? 判断目录是否存在,不存在条件为真 |
| $ [[ -f /shell01/1.sh ]];echo $? 判断文件是否存在,并且是一个普通的文件 |
2)判断文件权限
判断参数 |
含义 |
-r |
当前用户对其是否可读 |
-w |
当前用户对其是否可写 |
-x |
当前用户对其是否可执行 |
-u |
是否有suid,高级权限冒险位 |
-g |
是否sgid,高级权限强制位 |
-k |
是否有t位,高级权限粘滞位 |
3)判断文件新旧
判断参数 |
含义 |
file1 -nt file2 |
比较file1是否比file2新 |
file1 -ot file2 |
比较file1是否比file2旧 |
file1 -ef file2 |
比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode |
说明:这里的新旧指的是文件的修改时间!
4)判断整数
判断参数 |
含义 |
-eq |
相等 |
-ne |
不等 |
-gt |
大于 |
-lt |
小于 |
-ge |
大于等于 |
-le |
小于等于 |
5)判断字符串
判断参数 |
含义 |
-z |
判断是否为空字符串,字符串长度为0则成立 |
-n |
判断是否为非空字符串,字符串长度不为0则成立 |
string1 = string2 |
判断字符串是否相等 |
string1 != string2 |
判断字符串是否相不等 |
6)多重条件判断
判断符号 |
含义 |
举例 |
-a 和 && |
逻辑与 |
[ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ] |
-o 和 || |
逻辑或 |
[ 1 -eq 1 -o 1 -ne 1 ] |
说明:
- &&:前面的表达式为真,才会执行后面的代码;
- ||:前面的表达式为假,才会执行后面的代码;
- ;:只用于分割命令或表达式;
举例:
| $ [ $(id -u) -eq 0 ] && echo "the user is admin" |
| [root@localhost ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin" |
| [root@localhost ~]$ [ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin" |
| 注意:在(( ))中,=表示赋值;==表示判断 |
| $ ((1==2));echo $? |
| $ ((1<2));echo $? |
| $ ((2>=1));echo $? |
| $ ((2!=1));echo $? |
| $ ((`id -u`==0));echo $? |
| |
| $ ((a=123));echo $a |
| $ ((a==123));echo $? |
| $ a=hello;b=world |
| $ [ $a = $b ];echo $? |
| $ [ "$a" = "$b" ];echo $? |
| $ [ "$a" != "$b" ];echo $? |
| $ [ "$a" == "$b" ];echo $? |
逻辑运算符总结
1)符号;和&&和||都可以用来分割命令或者表达式;
2)分号(;)完全不考虑前面的语句是否正确执行,都会执行;号后面的内容;
3)&&符号,需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然;
4)||符号,需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后内容;反之亦然;
5)如果&&和||一起出现,从左往右依次看,按照以上原则;
二、流程控制语句
2.1 基本语法结构
1)单分支if结构

2)双分支if结构
| if 条件测试操作 |
| then |
| 命令序列 |
| else |
| 命令序列 |
| fi |

3)多分支if结构
| if 条件测试操作1 |
| then |
| 命令序列1 |
| elif 条件测试操作2 |
| then |
| 命令序列2 |
| else |
| 命令序列3 |
| fi |

4)多层嵌套if结构
| if 条件测试操作1 |
| then |
| 命令序列1 |
| if 条件测试操作2 |
| then |
| 命令序列2 |
| fi |
| else |
| if 条件测试操作3 |
| then |
| 命令序列3 |
| elif 条件测试4 |
| then |
| 命令序列4 |
| else |
| 命令序列5 |
| fi |
| fi |

2.2 应用示例
1)判断两台主机是否可以通信
| #!/bin/bash |
| |
| # 交互式定义变量,让用户自己决定ping哪个主机 |
| read -p "请输入你要ping的主机的IP:" ip |
| |
| # 使用ping程序判断主机是否互通 |
| ping -c1 $ip &>/dev/null |
| |
| if [ $? -eq 0 ];then |
| echo "当前主机和远程主机$ip是互通的" |
| else |
| echo "当前主机和远程主机$ip不通的" |
| fi |
2)判断一个进程是否存在
| #!/bin/bash |
| # 判断一个程序(httpd)的进程是否存在 |
| pgrep httpd &>/dev/null |
| if [ $? -ne 0 ];then |
| echo "当前httpd进程不存在" |
| else |
| echo "当前httpd进程存在" |
| fi |
pgrep命令:以名称为依据从运行进程队列中查找进程,并显示查找到的进程id!
选项:
-o:仅显示找到的最小(起始)进程号;
-n:仅显示找到的最大(结束)进程号;
-l:显示进程名称;
-P:指定父进程号;pgrep -p 4764 查看父进程下的子进程id
-g:指定进程组;
-t:指定开启进程的终端;
-u:指定进程的有效用户ID。
3)判断一个服务是否正常
| #!/bin/bash |
| #定义变量 |
| web_server=www.baidu.com |
| #访问网站 |
| wget -P /shell/ $web_server &>/dev/null |
| [ $? -eq 0 ] && echo "当前网站服务是ok" && rm -f /shell/index.* || echo "当前网站>服务不ok,请立刻处理" |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律