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

shell-条件判断

目录

一、条件判断

1.按照文件类型进行判断

2.按照文件权限进行判断

3.两个文件之间进行比较

4.两个整数之间进行比较

5.字符串的判断

6.多重条件判断

二、if条件判断

1.单分支if条件语句

2.双分支if条件语句

(1)判断某文件是否存在

(2)重启服务

3.多分支if条件语句

三、多分支case条件语句

if条件语句可以判断范围类型,case条件语句只能判断准确的字符串


一、条件判断

1.按照文件类型进行判断

类型       作用
-b文件判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据。例如U盘,SD卡。
-c 文件判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真) 字符设备是指在I/O传输过程中以字符为单位进行传输的设备例如键盘,打印机。
-d 文件判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件判断该文件是否存在(存在为真)
-f 文件判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件判断该文件是否存在,并且是否为符号连接文件(是符号连接文件为真)
-p 文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件判断该文件是否存在,并且是否为非空(非空为真)
-S 文件判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

使用[]括号来进行判断,利用$?来检测判断结果。

[root@localhost ~]# [ -e /etc/passwd ] 
[root@localhost ~]# echo $?
0			 
[root@localhost ~]# [ -e /etc/test ] 
[root@localhost ~]# echo $?
1

此命令还可以结合之前所学的&&和||再来进行判断:

[root@localhost ~]# [ -d /etc/passwd ] && echo "yes" || echo "no" 
no
[root@localhost ~]# [ -d /etc/ ] && echo "yes" || echo "no" 
yes
#第一个判断命令如果正确执行打印yes,否则打印no。

2.按照文件权限进行判断

选项作用
-r 文件判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w 文件判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x 文件判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u 文件判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g 文件判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k 文件判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

3.两个文件之间进行比较

选项作用
文件1 -nt 文件2判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2

判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。

(这个判断用于判断硬链接是很好的方法。)

4.两个整数之间进行比较

选项作用
整数1 -eq 整数2判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2判断整数1是否和整数2不相等(不相等为真)
整数1 -gt 整数2判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2判断整数1是否大于等于整数2(大于等于为真)
整数1 -le 整数2判断整数1是否小于等于整数2(小于等于为真)

5.字符串的判断

选项作用
-z 字符串判断字符串变量是否为空(为空返回真)
-n 字符串判断字符串变量是否为非空(非空返回真)
字串1 == 字串2判断字符串1变量是否和字符串2变量相等(相等返回真)
字串1 != 字串2判断字符串1变量是否和字符串2变量不相等(不相等返回真)

#字串! = = 字串2 在test变量测试当中通过man查询并没有这种= =的操作,而是通过单个等于号进行测试判断的,在/etc/profile文件中判断umask就是使用的单个等于号=来进行的变量测试。=单个等于号是规范的书写格式。

6.多重条件判断

选项作用
判断1 -a 判断2逻辑与,判断1和判断2都成立,最终的结果才为真。
判断1 -o 判断2逻辑或,判断1和判断2有一个成立,最终的结果就为真。
!逻辑非,使原始的判断式取反。
[root@localhost ~]# aa=11 	 
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no" 
no 	 	 	 	 
[root@localhost ~]# aa=24 	 
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no" 
yes

#逻辑非:
[root@localhost ~]# [ ! -n "$aa" ] && echo "yes" || echo "no" 
no

二、if条件判断

1.单分支if条件语句

       单分支条件语句最为简单,就是只有一个判断条件,如果符合条件则执行某个程序,否则什么事情都不做。语法如下:

if [条件判断式] ;then 
    程序
fi

单分支条件语句注意:

if语句使用fi结尾,和一般语言使用大括号结尾不同。

[条件判断式]中括号和条件判断式之间必须有空格。

       then后面跟符合条件之后执行的程序,可以放在[]之后,用;分隔。也可以换行写入, 就不需要“;”了。比如: 

if [条件判断式] 
    then
        程序
fi 

例:

[root@localhost ~]# cat if1.sh 
#!/bin/bash
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f1)
#分区使用率赋值rate,df -h 命令截取/dev/sda3,awk截取第五列,cut指定分隔符为%并显示第一行。
if [ $rate -ge 80 ]
#判断rate的值如果大于等于80则执行then程序。
 	then
 	 	echo "warning! /dev/sda3 is full!!!" 
#打印警告信息。在实际工作中可以向管理员发送邮件。
fi

2.双分支if条件语句

if [条件判断式]
    then 
        条件成立时,执行的程序。
    else
        条件不成立时,执行的另一个程序。
fi

(1)判断某文件是否存在

[root@localhost ~]# cat check_file.sh 
#!/bin/bash
read -p "Please input a file:" FILE #赋值FILE。
if [ -e $FILE ]						#检测是否有FILE文件。 
 	then
 	 	echo "$FILE exists"			#有文件输出exists。
    else
 	 	echo "$FILE not exists"		#没有文件输出not exists。
fi

(检查文件是否存在,给脚本执行权限。然后运行脚本,输入要检测的文件名。) 

(2)重启服务

[root@localhost ~]# cat autostart.sh 
#!/bin/bash
port=$(nmap -sT 192.168.22.222 | grep tcp | grep http | awk '{print $2}') 
if [ "$port" == "open" ]
 	then	
 	 	echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
 	else	
 	 	/etc/rc.d/init.d/httpd start &> /dev/null
 	 	echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
fi

(首先用nmap命令查看是否开启apache并赋值给port。

然后进行条件判断。如果服务开启,输出当前时间+httpd is ok 到/tmp/autostart- acc.log。

如果变量port的值不是open,那么执行else下操作。首先启动apache服务,将启动后信息输出至位桶,然后在/tmp/autostart-err.log中记录。在本次脚本中nmap命令使用的是IP查找端口,但并未指DNS,所以会报DNS不存在的错,但不影响结果。)

3.多分支if条件语句

if [条件判断式1]
    then
        当条件判断式1成立时,执行程序1。
elif [条件判断式2]
    then
        当条件判断式2成立时,执行程序2。
......(可加入更多条件) 
else
    当所有条件不成立时,最后执行此程序。
fi

例:用多分支条件语句判断一下用户输入的是一个文件还是一个目录:

[root@localhost ~]# cat if-elif.sh 
#!/bin/bash
#接收键盘输入并赋予变量file。
read -p "Please input you filename:" file
if [ -z "$file" ]	#判断file变量是否为空。
 	then 
        #如果为空,输出报错信息。
 	 	echo "Error,please input a filename"
#判断file的值是否存在。
elif [ ! -e "$file" ]
 	then 
        #如果不存在,输出此信息。
 	 	echo "your input is not file"
#判断file的值是否为普通文件。
elif [ -f "$file" ]
 	then
        #如果是普通文件输出此信息。
 	 	echo "$file is a regulare file"
#判断file是否是目录文件。
elif [ -d "$file" ]
 	then
        #如果是目录文件输出此信息。
 	 	echo "$fiel is a directory!"
#如果都不是则执行本程序。
else
    #都不是的话输出此信息。
 	echo "$file is an other file!"
fi

三、多分支case条件语句

       case语句和if..elif...else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。case语句语法如下:

case $变量名 in 
    “值1”)
        如果$变量等于值1,则执行程序1
        ;; 
    “值2”)
        如果$变量等于值2,则执行程序2
        ;;
    ....省略...
    *)
        如果$变量的值不是以上值,则执行此程序
        ;;
esac

case语句需注意以下内容:

       case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序,如果数值不符,则一次比较下一个值。如果所有的值都不符合,则执行“*”中的程序。*):代表所有其他值。

       case语句以case开头,以esac结尾。每个分支程序之后都要通过;;双分号结尾,代表该程序段结束。

例:

[root@localhost ~]# cat case.sh 
#!/bin/bash
read -t 5 -p "Please choose yes/no:" ch	#接收键盘输入并赋值ch,等待5秒提示信息。
case $ch in 
 	"yes")
 	 	echo "your choose is yes"	#如果变量ch为yes,输出此信息。
 	;;
 	"no")
 	 	echo "your choose is no"	#如果变量ch为no,输出此信息。
 	;;
 	*)
 	 	echo "your choose is error"	#当变量ch不是yes/no的时候输出此信息。
 	;;
esac

if条件语句可以判断范围类型,case条件语句只能判断准确的字符串


http://www.kler.cn/a/471191.html

相关文章:

  • ComfyUI节点安装笔记
  • RedisTemplate执行lua脚本及Lua 脚本语言详解
  • Allure 集成 pytest
  • Scala_【5】函数式编程
  • Echart实现3D饼图示例
  • 热备份路由HSRP及配置案例
  • iOS - 线程与AutoreleasePoolPage
  • 全覆盖路径规划算法之BCD源码实现(The Boustrophedon Cellular Decomposition)
  • linux下多个硬盘划分到同一挂载点
  • 电子应用设计方案87:智能AI收纳箱系统设计
  • SSR 【1】【nuxt安装】
  • pytorch torch.full_like函数介绍
  • 主板疑难杂症之解析(Analysis of Difficult and Miscellaneous Problems of Motherboard)
  • LogMiner
  • 【shell编程】报错信息:bash: bad file descriptor(包含6种解决方法)
  • Blazor用户身份验证状态详解
  • MySQL数据库 中的锁
  • 微服务登录解决方案
  • 如何申请LabVIEW软件著作权?
  • C# OpenCV机器视觉:背景减除与前景分离
  • Go语言中http.Transport的连接关闭策略与优化方法
  • 【Kaggle】练习赛《预测贴纸的销量》(中)
  • KBQA前沿技术
  • Springboot SAP Docker 镜像打包问题
  • Qt 写无边框窗口时,遇到的问题与解决方法
  • Vue 环境配置与项目创建指南