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 文件 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

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

bash 复制代码
[root@localhost ~]# [ -e /etc/passwd ] 
[root@localhost ~]# echo $?
0			 
[root@localhost ~]# [ -e /etc/test ] 
[root@localhost ~]# echo $?
1

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

bash 复制代码
[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有一个成立,最终的结果就为真。
! 逻辑非,使原始的判断式取反。
bash 复制代码
[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条件语句

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

bash 复制代码
if [条件判断式] ;then 
    程序
fi

单分支条件语句注意:

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

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

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

bash 复制代码
if [条件判断式] 
    then
        程序
fi 

例:

bash 复制代码
[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条件语句

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

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

bash 复制代码
[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)重启服务

bash 复制代码
[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条件语句

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

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

bash 复制代码
[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语句语法如下:

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

case语句需注意以下内容:

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

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

例:

bash 复制代码
[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条件语句只能判断准确的字符串

相关推荐
L·S·P17 分钟前
Linux 安装 meilisearch
linux·服务器·elasticsearch·搜索引擎·meilisearch
安科瑞王可21 分钟前
浙江安吉成新的分布式光伏发电项目应用
大数据·运维·分布式·科技·自动化
mgwzz26 分钟前
nfs开机自动挂载
linux·服务器·网络
一只小爪子1 小时前
通过 ulimit 和 sysctl 调整Linux系统性能
linux·运维·前端
Linux运维老纪2 小时前
Go语言之十条命令(The Ten Commands of Go Language)
服务器·开发语言·后端·golang·云计算·运维开发
真想骂*2 小时前
iOS开发指南:保护服务器密码的安全存储与处理技巧
服务器·安全·ios
Antonio9152 小时前
【Linux】环境变量
linux·运维·服务器
域智盾-运营小韩2 小时前
怎么管理电脑usb接口,分享四种USB端口管理方法
服务器·网络·负载均衡
guihong0042 小时前
Dubbo 关键知识点解析:负载均衡、容错、代理及相关框架对比
运维·负载均衡·dubbo
乌南竹3 小时前
六十三:七层负载均衡做了些什么?
运维·负载均衡