【shell】条件语句

一、测试

1.1文件测试test

test命令是内部命令

复制代码
test的语法
test 条件表达式
[ 条件表达式 ] 

test 选项 文件
-d :判断是否是目录
-f :判断是否是普通文件
-b :判断是否是块设备
-c :判断是否是字符设备
-e :判断是否存在  ##建议不使用
-e :判断是否存在  ##好用,建议使用
-r :判断是否有读的权限  ##好用
-w :判断是否有写的权限  ##好用
-x :判断是否有执行的权限  ##好用

test的用法

中括号的用法

注意-e和-a的区别,在于取反,建议使用-e即可

总结:test主要用于判断文件是否存在,[]也有这样的用处,所以常还是使用[],test不常用

1.2整数值比较[]

复制代码
整数的比较判断使用英文:
-eq :表示等于
-ne :表示不等于
-gt :表示大于
-ge :表示大于等于
-lt :表示小于
-le :表示小于等于

案例一:判断boot分区的使用率是否够用

案例二:比较两个变量的大小

1.3字符串比较

复制代码
= : 表示字符串相同
!= :表示字符串内容不相同
-z :表示字符串内容为空
-n :表示字符串存在
语法格式:
[ 字符串1 = 字符串2 ] ##判断两个字符串是否相同
[ 字符串1 != 字符串2 ] ##判断两个字符串是否不相同
[ -z 字符串 ] ##判断字符串是否为空或是否存在,(存在且空也为不存在)

案例一:判断变量是否有值

案例二:借助环境变量,判断用户是否存在

1.4逻辑测试(短路运算)

复制代码
短路运算
与:&&(相当于电路串联)
格式1:[判断1] && [判断2] 
格式2:命令1 && 命令2 
##表示需要命令1和命令2都为真,才为真,真的意思是$?为0

##执行逻辑:如果命令1为真,继续执行命令2,如果命令1为假,没必要执行命令2


或:|| (相当于电路并联)
格式1:[判断1] || [判断2] 
格式2:命令1 || 命令2 
##表示需要命令1和命令2其中一个为真,就为真,真的意思是$?为0

##执行逻辑:如果命令1为真,没必要执行命令2;如果命令1为假,执行命令2

合并用法:只需要记住一个

命令1 && 命令2 ||命令3:特殊用法,表示判断命令1执行结果,正确执行命令2,错误执行命令3

复制代码
#!/bin/bash
read -p "请输入想测试的ip地址:" ip
ping -c 3 -W2 $ip &>/dev/null && echo "$ip is online" || echo "$ip is offline"

-a或&&:逻辑与,表示而且的意思,全真为真

-o或||:逻辑或,表示或,一真为真

!:逻辑否

在条件表达式中是可以相互转换的,但是命令序列,不能变换

格式1:[判断1] && [判断2] (可以)
格式2:命令1 && 命令2 (不可以)

复制代码
下面哪些语法是错误的:
[root@localhost opt]#[ $a -ne 12 ]&& [ $a -gt 5 ];echo $?
[root@localhost opt]#[ $a -ne 12 -a $a -gt 5 ];echo $?
[root@localhost opt]#[[ $a -ne 12 && $a -gt 5 ]];echo $?
[root@localhost opt]#[ $a -ne 12 && $a -gt 5 ];echo $?  ##错误,需要双中括号
[root@localhost opt]#[ $a -ne 12 ] -a [ $a -gt 5 ];echo $?  ##错误,不能这样使用

产生随机数,测试运气

1.5双中括号(支持正则表达式和通配符)

复制代码
[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
 注意:此表达式用于[[ ]]中,PATTERN为通配符

=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
 注意: 此表达式用于[[  ]]中;扩展的正则表达式

总结:注意使用的语法,可以理解为双中括号可以支持模糊匹配

root@localhost opt\]#script=ping.sh \[root@localhost opt\]#\[\[ $script == \*.sh \]\];echo $?(可以) \[root@localhost opt\]#\[\[ $script =\~ sh$ \]\];echo $?(可以)

1.6小括号和花括号的区别

总结:

小括号类似于bash,在子bash中运行,不影响当前bash环境变量;

花括号类似于source,在当前的bash环境运行,会影响当前bash的环境变量的值;且需要以分号结尾

二、if语句的结构

if条件语句的结构类型

2.1单分支结构

复制代码
if [ 判断 ]
then
命令序列
fi

2.2双分支结构

复制代码
if [ 判断 ]
then
命令序列1
else
命令序列2
fi

2.3多分支结构

复制代码
if [ 判断1 ]
then
命令序列1
elif [ 判断2 ]
then
命令序列2
elif [ 判断3 ]
then
命令序列3
.....(可以有多个)
else
命令序列4
fi

实操1:判断是否为超级管理员

实操2:根据分数反馈表现结果

实操3:根据判断添加用户

实操4:剪刀石头步小游戏

实操5:判断几点,进行问好

三、case语句的结构

case的语法结构

复制代码
case 变量 in 
条件1)
命令序列1
;;
条件2)
命令序列2
;;
.....(可以添加多个条件)
esac  ##这就是case的反过来的字母
相关推荐
Roc.Chang2 分钟前
Ubuntu 下 VLC 无法启动(Segmentation fault)终极解决方案
linux·ubuntu·vlc·媒体播放
松涛和鸣30 分钟前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
简单中的复杂1 小时前
【避坑指南】RK3576 Linux SDK 编译:解决 Buildroot 卡死在 host-gcc-final 的终极方案
linux·嵌入式硬件
wVelpro1 小时前
如何在Pycharm 2025.3 版本实现虚拟环境“Make available to all projects”
linux·ide·pycharm
程序员老舅2 小时前
C++高并发精髓:无锁队列深度解析
linux·c++·内存管理·c/c++·原子操作·无锁队列
雨中风华2 小时前
Linux, macOS系统实现远程目录访问(等同于windows平台xFsRedir软件的目录重定向)
linux·windows·macos
Yeats_Liao2 小时前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
爱吃生蚝的于勒3 小时前
【Linux】进程信号之捕捉(三)
linux·运维·服务器·c语言·数据结构·c++·学习
The森3 小时前
Linux IO 模型纵深解析 01:从 Unix 传统到 Linux 内核的 IO 第一性原理
linux·服务器·c语言·经验分享·笔记·unix
文艺理科生Owen3 小时前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
运维·nginx