Shell条件测试符及if条件语句

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Shell条件测试符及if条件语句

一、条件测试操作


(1)test命令


  • 测试特定的表达式是否成立,当条件成立,测试语句的返回值为0,否则为其他数值(利用$?查看上一条命令是否执行成功)


格式1: test 条件表达式

格式2:[ 条件表达式 ] (至少有一个空格最好开头末尾都加一个空格)


(2)文件测试


格式: [ 操作符 文件或目录 ]


常用的测试操作符


-d :测试是否为目录 (Directory)

-e :测试目录或文件是否存在 (Exist)

-f :测试是否为文件 (File)

-r :测试当前用户是否有权限读取 (Read)

-w:测试当前用户是否有权限写入 (Weite)

-x :测试当前用户是否有权限执行 (eXcute)

(r w x 和chmod的给的权限是一样的)

[root@localhost ~]# [  -d /media/cdrom  ]
[root@localhost ~]# echo $?
0
`返回0表示条件成立`
[root@localhost ~]# [  -d /media/cdrom/Server  ]
[root@localhost ~]# echo $?
1
`返回1表示条件不成立`
[root@localhost ~]# [ -d /media/cdrom ] && echo "YES  
YES 
`条件成立时返回YES,&&逻辑与,“而且”的意思`

(3)整数值比较


格式:[ 整数1 操作符 整数2 ]


常用的测试操作符


  1. -eq: 等于 (Equal)
  2. -ne: 不等于 (Not Equal)
  3. -gt: 大于 (Greater Than)
  4. -lt :小于 (Lesser Than)
  5. le :小于或等于 (Lesser or Equal)
  6. -ge:大于或等于(Greater or Equal)
[root@localhost ~]# who | wc -l
7
————用户数是否 > 5
[root@localhost ~]# [ $(who | wc -l) -gt 5 ] && echo "aaa" 
aaa                     `(是否大于5,大于的话输出aaa)`
————用户数是否 >= 10
[root@localhost ~]# [ $(who | wc -l) -ge 10 ] && echo "bbb"
`(用户大于10,则输出bbb,用户不大于10,则什么都不输出)`
[root@localhost ~]# aaa=$(free -m | grep -i "mem" | awk '{print $4}')
`(可以一步一步执行命令去查看,$(free -m | grep -i "mem" | awk '{print $4}'),grep -i 不区分大小写)`
————空闲内存是否 < 1024MB     
[root@localhost ~]# [ $aaa -lt 1024 ] && echo "空闲内存为 ${aaa}MB"
空闲内存为 379MB
`(空闲内存小于1024则输出空闲内存为aaa的变量值MB)`

(4)字符串比较


格式1:


[ 字符串1 = 字符串2 ] (当字符串1内容相同于字符串2的时候条件成立 )

[ 字符串1 != 字符串2 ] (当字符串1内容不同于字符串2的时候条件成立)

格式2:


[ -z 字符串1 ] (当字符串1内容为空时条件成立)


常用的测试操作符


  1. =:字符串内容相同
  2. !=:字符串内容不同 (!表示相反的意思)
  3. -z:字符串内容为空
[root@localhost ~]# echo $LANG 
zh_CN.UTF-8
[root@localhost ~]# [ $LANG !=  "en.US" ] && echo  "Not en.US"
Not en.US              `(内容是否是en.US如果不是就输出 Not en.US)`
[root@localhost ~]# read -p “是否覆盖现有文件(yes/no)?"  ACK
是否覆盖现有文件(yes/no)?yes   `(交互式变量,ACK的变量值是yes)`
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖           `(ACK的变量值是否为yes ,是的话输出 覆盖)`

(5)逻辑测试


格式1: [ 表达式1 ] 操作符 [ 表达式2 ] …

格式2: 命令1 操作符 命令2 …


常用的测试操作符


-a 或 && :逻辑与,“而且”的意思

-o 或 || :逻辑或,“或者”的意思

! :逻辑否

(1)、查看当前用户

[root@localhost ~]# echo $USER
Root            `($USER是系统表量,显示当前用户)`
[root@localhost ~]# [ $USER != "teacher" ]  &&  echo "Not teacher"
Not teacher                 `(当$USER不等于 teacher时 输出Not teacher)`

(2)、测试目录是否存在

————如何测试/opt/backup目录是否存在?
 [root@localhost ~]# [ -d /media/cdrom ] && echo "YES" || echo "NO”
`(检查/media/cdrom是否为目录,是的话输出YES,不是的话输出NO,条件成立时||的前一个不成立是后一个)`

3、查看任务进程

————查询当前的活动进程数,并测试是否小于100?
[root@localhost ~]# [ $(ps aux | wc -l) -lt 100 ] && echo "YES" || echo "NO"
YES              `(小于100的话则是YES,大于100的话则是NO,ps aux 查看静态进程,wc -l统计行数)`

(4)、测试是否安装软件包

————如何测试是否已安装sysstat软件包?
[root@localhost ~]# rpm -q sysstatpackage 
未安装软件包 sysstatpackage
[root@localhost ~]# [ $? -eq 0 ] && echo "Installed." || echo "Not installed."
Not installed.        `($? 上条命令的结果,0为成立,除外都为不成立,这里判定的是未安装所以算不成立)`
`(如果上条命令结果成立,则输出lnstalled,如果不成立则输出Not installed)`

(5)、利用条件测试编写脚本,测试服务是否安装

————编辑脚本rpm_install.sh
***用来判断软件是否安装,如果已安装输出“此软件已安装”,如果未安装则进行安装
[root@localhost ~]# vim rpm_install.sh
#!/bin/bash
***查看rpm软件是否已安装
rpm -q $1 &> /dev/null
***已安装输出结果,未安装则进行安装
[ $? -eq 0 ] && echo "$1 软件已安装"  || yum -y install $1 &> /dev/null
`(/dev/null相当于一个回收站)`
[root@aaa ~]# chmod +x rpm_install.sh   ***(给可执行权限)
[root@aaa ~]# ./rpm_install.sh httpd    ***(验证脚本)
[root@aaa ~]# rpm -q httpd              ***(发现已经安装)
httpd-2.4.6-93.e17.centos.x86_64

if语句的结构


一、单分支结构


if 条件测试操作;then 命令序列

fi

例如:

if 磁盘已占用空间>80%;then 报警

(;可以在当前行直接写命令序列,不加;的话需要空到下一行去写)

【if开头,fi结束,then写命令序列,如果不符合if的条件则什么不做】


单分支if语句

————判断挂载点目录,若不存在则自动创建
[root@localhost ~]# cat 1.sh
#!/bin/bash
A="/media/cdrom/"
if [ ! -d $A ]
then
`(当目录不存在时执行mkdir -p $A,存在的话不会做任何操作)`
    mkdir -p $A
fi
[root@localhost ~]# chmod +x 1.sh
[root@localhost ~]# ./1.sh


二、双分支结构


if 条件测试操作; then 命令序列1

else 命令序列2

fi


例如:


if 80端口是否在监听;then 网站服务已在运行

else 启动httpd服务

fi


【if开始,fi结束,if条件测试成立的话执行then的命令序列,否则执行else的命令序列】


双分支if语句

判断目标主机是否存活,显示检测结果
[root@localhost ~]# cat 2.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null     
`(/dev/null是“黑洞”相当于一个回收站,放进去的数据都会自动删除)`
if [ $? -eq 0 ]
`(判断ping命令的检测结果,分别给出不同提示,利用$1位置变量)`
then
    echo "主机 $1 可以进行通信."
else
    echo "主机 $1 无法进行通信."
fi
[root@localhost ~]# ./2.sh 192.168.4.11
主机 192.168.4.11 可以进行通信.
[root@localhost ~]# ./2.sh 192.168.4.13
主机 192.168.4.13 无法进行通信.
`ping命令的-c、-i、-W 选项分别指定测试包个数、发送间隔、超时时间`


三、多分支结构


if 条件测试操作1;then 命令序列1

elif 条件测试操作2 ;then 命令序列2

else;命令序列3

fi

例如:

if 分数为85~100之间;then 判为优秀

elif 分数为70~84之间;then 判为合格

esle;判为不合格

fi

【if开始,fi结束,条件测试操作1成立时执行then1的命令序列,条件测试操作2成立时执行then2的命令序列,以此推类,elif理论是可以无限写的,但是如果判定结果与所有的条件测试操作都不符合,则执行else的命令序列】


多分支if语句

————判断分数范围,分出优秀、合格、不合格三档
[root@localhost ~]# cat 3.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" A
if [ $A -ge 85 ] && [ $A -le 100 ] ; then  
`(如果符合这个条件执行这个)`
`(判断分数所在区间,给出不同的分档结果)`
    echo "$A 分!优秀"
elif [ $A -ge 70 ] && [ $A -le 84 ] ; then
`(如果符合这个条件执行这个)`
    echo "$A 分,合格"
else                         `(否则执行这个)`
    echo "$A 分?不合格”
fi
[root@localhost ~]#chmod a+x  3.sh
[root@localhost ~]# ./3.sh
请输入您的分数(0-100):89
89 分!优秀
[root@localhost ~]# ./3.sh
请输入您的分数(0-100):75
75 分,合格
[root@localhost ~]# ./3.sh
请输入您的分数(0-100):60
60 分?不合格


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6月前
|
Python
Python中 If语句条件测试
Python中 If语句条件测试
76 1
|
6月前
|
Shell
在Shell脚本中的if语句
在Shell脚本中的if语句
94 1
|
11月前
|
测试技术 Shell
shell脚本写的班级管理系统测试用例
shell脚本写的班级管理系统测试用例
96 1
|
6月前
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】⭐⭐⭐Linux 测试与目标主机之间的网络连接ping 命令 使用指南
【Shell 命令集合 网络通讯 】⭐⭐⭐Linux 测试与目标主机之间的网络连接ping 命令 使用指南
167 1
|
1月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
69 4
|
3月前
|
Shell
[shell]在curl测试的data参数中引用变量
[shell]在curl测试的data参数中引用变量
204 1
|
5月前
|
Shell
Shell脚本之条件语句if总结
Shell脚本之条件语句if总结
|
5月前
|
Shell Linux BI
linux shell脚本中 if 条件判断
linux shell脚本中 if 条件判断
37 0
|
6月前
|
机器学习/深度学习 Ubuntu Shell
shell 脚本 条件语句
shell 脚本 条件语句
|
6月前
|
Shell
shell 学习(四)【if语法 for循环控制】
shell 学习(四)【if语法 for循环控制】
43 0