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

42.Shell脚本判断和if语句及相关案例

Shell脚本判断和if语句及相关案例

条件测试类型

Shell 脚本支持三种主要的条件测试类型:

  • 整数测试:数值比较
  • 字符测试:字符串比较
  • 文件测试:文件属性和权限检查

条件测试表达式

Shell 提供三种条件测试表达式:
# 方括号表达式
[ 条件表达式 ]# 双括号表达式(支持更多功能)
[[ 条件表达式 ]]# test 命令
test 条件表达式

整数测试运算符

运算符描述示例
-eq等于[ $a -eq $b ]
-ne不等于[ $a -ne $b ]
-gt大于[ $a -gt $b ]
-lt小于[ $a -lt $b ]
-ge大于等于[ $a -ge $b ]
-le小于等于[ $a -le $b ]

特殊变量

  • $#:脚本参数个数
  • $?:上一条命令的退出状态
  • >/dev/null 2>&1:将标准输出和错误输出都重定向到空设备
#!/bin/bash
a=10
b=20[ $a -eq $b ]
echo $?[ $a -ne $b ]
echo $?[ $a -gt $b ]
echo $?[ $a -lt $b ]
echo $?[ $a -ge $b ]
echo $?[ $a -le $b ]
echo $?            ##如果结果为0,则代表运行成功,如果为1-255,则代表运行失败
[root@xieyuhui ~]# bash b.sh 
1
0
1
0
1
0

字符测试运算符

运算符描述示例
==字符串相等[ "$a" == "$b" ]
!=字符串不等[ "$a" != "$b" ]
-z字符串为空[ -z "$a" ]
-n字符串非空[ -n "$a" ]
#!/bin/basha=10
b=5[ $a == $b ]
echo $?[ $a != $b ]
echo $?[ -z "$a" ]    #空则为真,不空则为假
echo $?[ -n "$b" ]    #不空则为真,空则为假
echo $?
[root@xieyuhui ~]# bash c.sh 
1
0
1
0

文件存在性及类型测试

选项描述示例
-e文件存在[ -e file ]
-f是普通文件[ -f file ]
-d是目录[ -d dir ]
-L是符号链接[ -L file ]
-b是块设备文件[ -b file ]
-c是字符设备文件[ -c file ]
#!/bin/bashtouch /tmp/file1
touch /tmp/file2
mkdir /tmp/dir1
ln -s /tmp/dir1 /tmp/dir2
mkdir /tmp/dir3
chmod g+s /tmp/dir3
#!/bin/basha=/tmp/file1
b=/tmp/file2
c=/tmp/dir1
d=/tmp/dir2
e=/tmp/dir3
f=/tmp/file4[ -e $a ]&&echo "file1已存在"||"file1不存在"
[ -e $f ]&&echo "file4已存在"||"file4不存在"
[ -f $b ]&&echo "file2是普通文件"||echo "file2不是普通文件"
[ -d $c ]&&echo "dir1是目录"||echo "dir1不是目录"
[ -L $d ]&&echo "dir2是链接文件"||echo "dir2不是链接文件"
[ -g $e ]&&echo "dir3有g+s权限"||echo "dir3没有g+s权限"
[root@xieyuhui ~]# bash e.sh 
file1已存在
e.sh: line 11: file4不存在: command not found
file2是普通文件
dir1是目录
dir2是链接文件
dir3有g+s权限

文件比较测试

选项描述示例
file1 -nt file2file1 比 file2 新[ file1 -nt file2 ]
file1 -ot file2file1 比 file2 旧[ file1 -ot file2 ]
file1 -ef file2是同一个文件[ file1 -ef file2 ]

文件权限测试

选项描述示例
-r可读[ -r file ]
-w可写[ -w file ]
-x可执行[ -x file ]

文件特殊属性测试

选项描述示例
-s文件非空[ -s file ]
-N文件被修改过[ -N file ]
-O文件属主是当前用户[ -O file ]

组合测试条件

运算符描述示例
-a&&逻辑与[ 条件1 -a 条件2 ][ 条件1 ] && [ 条件2 ]
-o 或 ``
!逻辑非[ ! 条件 ]

单分支 if 语句

if 条件; then执行的命令
fi

当前用户是不是xieyuhui,如果不是那么返回ERROR

#!/bin/bashif [ $USER != "xieyuhui" ];thenecho "ERROR"
fi
[root@xieyuhui ~]# bash a.sh 
ERROR

双分支 if 语句

if 条件; then执行的命令1
else执行的命令2
fi

判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如
果是普通用户输出”hey guest“

#!/bin/bashif [ $USER="root" ];thenecho "hey admin"
elseecho "hey guest"
fi
[root@xieyuhui ~]# bash b.sh 
hey admin
[root@xieyuhui ~]#

多分支 if 语句

if 条件1; then执行命令1
elif 条件2; then执行命令2
elif 条件3; then执行命令3
else执行命令4
fi

用if做判断,是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于

#!/bin/bashread -p '请输入两个参数:' n m
expr $n + $m >/dev/null 2>&1
[ $? -ne 0 ]&&{echo '输入的数必须为整数'exit
}
if [ $n -gt $m ];thenecho "$n大于$m"
elif [ $n -eq $m ];thenecho "$n等于$m"
elseecho "$n小于$m"
fi
[root@xieyuhui ~]# bash c.sh 
请输入两个参数: 12 12
12等于12
[root@xieyuhui ~]# bash c.sh 
请输入两个参数: 12  44
12小于44
[root@xieyuhui ~]# bash c.sh 
请输入两个参数: 14 1
14大于1

文章转载自:

http://6DfgJyoo.fwkpp.cn
http://7z8X1IZV.fwkpp.cn
http://iYNQxnGj.fwkpp.cn
http://2uscp7Nx.fwkpp.cn
http://DuvzgxNT.fwkpp.cn
http://MXlxu3Yl.fwkpp.cn
http://kmBm8GGE.fwkpp.cn
http://KzxaiSJK.fwkpp.cn
http://m5jARXAG.fwkpp.cn
http://PRdASVjS.fwkpp.cn
http://4Gn8cJCw.fwkpp.cn
http://cf14FeUQ.fwkpp.cn
http://nTbDdsqF.fwkpp.cn
http://0BV6I91Z.fwkpp.cn
http://D1XsW7uu.fwkpp.cn
http://B2kF1qIo.fwkpp.cn
http://AjhUKhS2.fwkpp.cn
http://S0JtBkuX.fwkpp.cn
http://SDXtMtmd.fwkpp.cn
http://5QxPVtla.fwkpp.cn
http://5xDQEXzj.fwkpp.cn
http://XRZZ0a9i.fwkpp.cn
http://gLUvsF4i.fwkpp.cn
http://VnD9jwvf.fwkpp.cn
http://diwkJCPS.fwkpp.cn
http://UkreHNCu.fwkpp.cn
http://xAKBhCKS.fwkpp.cn
http://gqw1F63Q.fwkpp.cn
http://vUzXJ7lR.fwkpp.cn
http://sdrkBOj0.fwkpp.cn
http://www.dtcms.com/a/375072.html

相关文章:

  • Game Runtime Libraries Package 解决游戏运行的痛点困境
  • 《P3825 [NOI2017] 游戏》
  • 第三课、Cocos Creator 项目创建与目录结构详解
  • C#中的浅拷贝与深拷贝
  • docker 整理几个常用的指令
  • Git上有更新而本地无更新时的解决方案
  • Doc2X为一切AI文档服务的基础设施,将PDF转换为Word、HTML、LaTeX、Markdown等
  • k8s 内置的containerd配置阿里云个人镜像地址及认证
  • 新节点加入k8s集群命令查看
  • 在 PostgreSQL中查看有哪些用户
  • 【从零开始的大模型原理与实践教程】--第一章:NLP基础概念
  • 零侵入式对接美团核销接口的技术合作模式
  • Kafka面试精讲 Day 14:集群扩容与数据迁移
  • 解耦-IOCDI
  • 【秋招笔试】2025.09.07蚂蚁算法岗笔试题
  • 10月17日,博睿数据受邀出席GOPS 全球运维大会 2025 · 上海站!
  • 第三方软件测评机构:MongoDB分片集群写入吞吐量与延迟第三方性能测评
  • 【硬件-笔试面试题-76】硬件/电子工程师,笔试面试题(知识点:H桥驱动电路的设计要点)
  • 【56页PPT】数字孪生智能工厂总体结构技术架构MES+ERP建设方案(附下载方式)
  • type(类型别名)和 interface的区别和最佳实践
  • 【直流电机鲁棒控制】matlab实现H无穷大控制的直流电机鲁棒控制研究
  • 4 C 语言数据结构实战:栈和队列完整实现(结构体 + 函数)+ 最小栈解决方案
  • day2 java 基础语法
  • Elasticsearch:智能搜索的 MCP
  • 数据结构与算法-树和二叉树-二叉树的存储结构(Binary Tree)
  • OpenCV 图像金字塔
  • 2025年渗透测试面试题总结-61(题目+回答)
  • 传统项目管理和流程管理区别
  • Blender来设计一个机器宠物-完整的3D建模流程
  • TI-92 Plus计算器:矩阵计算功能介绍