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

Shell 脚本条件测试与 if 语句

Shell 脚本条件测试与 if 语句

一、条件测试类型

  1. 整数测试:比较两个整数的大小或相等性。
  2. 字符测试:比较字符串或检查字符串属性。
  3. 文件测试:检查文件或目录的属性、权限等。

二、条件测试的表达式

Shell 提供了三种方式进行条件测试:

  • [ 条件表达式 ]
  • [[ 条件表达式 ]]
  • test 条件表达式

示例

test -e file && echo true || echo false
[ -e file ] && echo true || echo false
[[ -e file ]] && echo true || echo false

在这里插入图片描述

三、整数测试

运算符说明
-eq等于
-ne不等于
-gt大于
-lt小于
-ge大于等于
-le小于等于

示例:比较两个整数

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

方式一:通过命令行参数传递

#!/bin/bash
if [ $# -ne 2 ]; thenecho "必须输入两个参数"exit
fiexpr $1 + $2 >/dev/null 2>&1
if [ $? -ne 0 ]; thenecho "输入的参数必须是整数"exit
fiif [ $1 -gt $2 ]; thenecho "$1 大于 $2"
elif [ $1 -eq $2 ]; thenecho "$1 等于 $2"
elseecho "$1 小于 $2"
fi

在这里插入图片描述

方式二:通过 read 输入

#!/bin/bash
read -p "请输入两个整数: " n mexpr $n + $m >/dev/null 2>&1
if [ $? -ne 0 ]; thenecho "输入的参数必须是整数"exit
fiif [ $n -gt $m ]; thenecho "$n 大于 $m"
elif [ $n -eq $m ]; thenecho "$n 等于 $m"
elseecho "$n 小于 $m"
fi

在这里插入图片描述

>/dev/null 2>&1 表示将标准输出和错误输出都重定向到 /dev/null(即丢弃所有输出)。

示例:菜单选择

#!/bin/bash
echo "请选择你喜欢的颜色:"
cat <<EOF
1.黑色
2.蓝色
3.红色
EOFread -p "请输入你喜欢颜色编号: " num
[ $num -eq 1 -o $num -eq 2 -o $num -eq 3 ]&&{[ $num -eq 1 ]&&{echo '你喜欢黑色!'exit}[ $num -eq 2 ]&&{echo '你喜欢蓝色'exit}[ $num -eq 3 ]&&{echo '你喜欢红色'exit}
}||{echo '其他'exit
}

在这里插入图片描述

四、字符测试

运算符说明
===字符串相等(两边需空格)
!=字符串不等
-z "str"字符串为空则为真
-n "str"字符串非空则为真

五、文件测试

存在性测试:
  • -e:文件是否存在
类型测试:
  • -b:块设备文件
  • -c:字符设备文件
  • -f:普通文件
  • -d:目录
  • -L:符号链接文件
  • -p:命名管道文件
  • -S:套接字文件
权限测试:
  • -r:可读
  • -w:可写
  • -x:可执行
特殊权限测试:
  • -g:设置了 SGID
  • -u:设置了 SUID
  • -k:设置了 Sticky Bit
其它测试:
  • -s:文件非空
  • -N:文件自上次读取后被修改
  • -O:文件属于当前用户
  • -G:文件属组是当前用户组
双目测试:
  • file1 -ef file2:是否相同 inode
  • file1 -nt file2:file1 是否比 file2 新
  • file1 -ot file2:file1 是否比 file2 旧

示例

[root@yanyvhang tmp]# mkdir /tmp/dir1
[root@yanyvhang tmp]# ln -s /tmp/dir1 /tmp/dir2
[root@yanyvhang tmp]# mkdir /tmp/dir3
[root@yanyvhang tmp]# chmod g+s /tmp/dir3
#!/bin/bash
a=/tmp/file1
b=/tmp/file2
c=/tmp/dir1
d=/tmp/dir2
e=/tmp/dir3
f=/tmp/file4
[ -e $a ]&&echo "file1文件已存在"||echo "file1文件不存在"
[ -e $f ]&&echo "file4文件存在"||echo "file4文件不存在"
[ -f $b ]&&echo "file2这是一个普通文件"||echo "file2不是普通文件"
[ -d $c ]&&echo "dir1这是一个目录"||echo "dir1不是一个目录"
[ -L $d ]&&echo "dir2这是一个链接文件"||echo "dir2不是一个链接文件"
[ -g $e ]&&echo "dir3这个具有SGID权限"||echo "dir3不具有SGID权限"

在这里插入图片描述

六、组合测试条件

  • -a 等价于 &&
    • 与关系
  • -o 等价于 ||
    • 或关系
  • ! 等价于 !=
    • 非关系

示例

在这里插入图片描述

七、if 语句

单分支 if
if [ 条件 ]; then命令
fi

示例:判断当前用户是否为 root

#!/bin/bash
if [ "$USER" != "root" ]; thenecho "ERROR: need to be root so that!"
fi
多分支 if
if [ 条件 ]; then命令1
elif[ 条件 ]; then命令3
else命令2
fi

示例:判断当前用户是否为 root

#!/bin/bash
if [ $USER = "root" ];thenecho "hey admin"
elseecho "hey guest"
fi

在这里插入图片描述

示例:比较两个整数

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

#!/bin/bash
read -p '请输入要比较的两个参数:' n mexpr $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

在这里插入图片描述


文章转载自:

http://NALLqwgS.wtrjq.cn
http://PZ9weNNK.wtrjq.cn
http://cD8UtUML.wtrjq.cn
http://PMkTt5rA.wtrjq.cn
http://zMjkLAp5.wtrjq.cn
http://JrOlh2vh.wtrjq.cn
http://9NoDEs5P.wtrjq.cn
http://HADQx2X6.wtrjq.cn
http://kG91F0Mb.wtrjq.cn
http://CekC67fH.wtrjq.cn
http://w4UYrD7R.wtrjq.cn
http://AjL8WzQm.wtrjq.cn
http://NgF0fn78.wtrjq.cn
http://fCA4gyL6.wtrjq.cn
http://oZkQZVEX.wtrjq.cn
http://ip2LKChY.wtrjq.cn
http://PnpDHD6K.wtrjq.cn
http://i4QWq2bl.wtrjq.cn
http://Qdx6QFvf.wtrjq.cn
http://weO51jRX.wtrjq.cn
http://FyD3Uaad.wtrjq.cn
http://JseoCmmq.wtrjq.cn
http://qib6KI1W.wtrjq.cn
http://NhvYLWmd.wtrjq.cn
http://XjRGe4dB.wtrjq.cn
http://qe9VF82U.wtrjq.cn
http://KetXCmwT.wtrjq.cn
http://nyOKOONY.wtrjq.cn
http://awHVvW0D.wtrjq.cn
http://UEKmsfk6.wtrjq.cn
http://www.dtcms.com/a/375332.html

相关文章:

  • 【倒数日子隐私收集】
  • Diamond基础4:仿真流程、添加原语IP核
  • Java入门级教程14——同步安全机制明锁
  • [JavaWeb]模拟一个简易的Tomcat服务(Servlet注解)
  • MongoDB vs MySQLNoSQL与SQL数据库的架构差异与选型指南
  • Vue框架技术详解——项目驱动概念理解【前端】【Vue】
  • mardown-it 有序列表ios序号溢出解决办法
  • 目前主流热门的agent框架
  • 如何验证邮箱是否有效?常见方法与工具推荐
  • Python 类型注释核心知识点:变量、函数 / 方法与 Union 类型分步解析
  • 端口转发实操
  • 【算法--链表】116.填充每个节点的下一个右侧节点指针--通俗讲解
  • html+js实现表格本地筛选
  • 领码方案|Linux 下 PLT → PDF 转换服务超级完整版:异步、权限、进度
  • pyside6 的pdf显示测试 -- 01
  • 算法篇——动态规划【力扣Hot100】
  • 《WINDOWS 环境下32位汇编语言程序设计》第14章 异常处理
  • 中间件八股
  • thrust cub cccl 安装与应用示例
  • Expect-自动化交互工具
  • RL【6】:Stochastic Approximation and Stochastic Gradient Descent
  • 计算机毕设Python项目:基于爬虫技术的网络小说数据分析系统
  • 基于springboot 校园餐厅预约点餐微信小程序的设计与实现(代码+数据库+LW)
  • Day20 K8S学习
  • Mockito 原理与实战
  • Django项目架构
  • SpringBoot整合通用ClamAV文件扫描病毒
  • 提权分析报告 —— 基于DriftingBlues: 4靶场
  • 设计模式-原则概述
  • LAMPSecurity: CTF8靶场渗透