shell基础--条件判断if和case

目录

一、条件判断

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

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

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

4.两个整数之间比较

5.字符串的判断

6.多重条件判断

二、if条件判断

1.单分支if条件语句

2.双分支if条件语句

例1:判断某文件是否存在

例2:重启服务。

3.多分支if条件语句

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

3、多分支case条件语句


一、条件判断

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

测试选项

作用

-b 文件

判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)

块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据。例如U盘,SD卡

-c 文件

判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)字符设备是指在I/O传输过程中以字符为单位进行传输的设备例如键盘,打印机。

-d 文件

判断该文件是否存在,并且是否为目录文件(是目录为真)

-e 文件

判断该文件是否存在(存在为真)

-f 文件

判断该文件是否存在,并且是否为普通文件(是普通文件为真)

-L 文件

判断该文件是否存在,并且是否为符号连接文件(是符号连接文件为真)

-p 文件

判断该文件是否存在,并且是否为管道文件(是管道文件为真)

-s 文件

判断该文件是否存在,并且是否为非空(非空为真)

-S 文件

判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

使用[]括号来进行判断,利用$?来检测判断结果 test 命令和 [ ] 等同

【】# [ -e /etc/passwd ]

【】# echo $?

0

【】# [ -e /etc/test ]

【】# echo $?

1

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

【】# [ -d /etc/passwd ] && echo "yes" || echo "no"

no

【】# [ -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有一个成立,最终的结果就为真。

逻辑非,使原始的判断式取反。

【】# aa=11

【】# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"

no

【】# aa=24

[】# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"

yes

逻辑非:

【】# [ ! -n "$aa" ] && echo "yes" || echo "no"no

在shell中,流程分为两大类。一类是“循环”一类是“判断选择”。属于循环的有for、

while、until。属于“判断选择”的有if、case。

二、if条件判断

1.单分支if条件语句

但分支条件语句最为简单,就是只有一个判断条件,如果符合条件则执行某个程序,否

则什么事情都不做。语法如下:

if [条件判断式] ;then

程序

fi

单分支条件语句注意:

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

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

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

if [ 条件判断式 ]

then

程序

fi

例:

【】# 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:判断某文件是否存在

【】# 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:重启服务。

在日常工作中,服务器上的服务经常会宕机。如果我们对服务器监控不好,就会造成服务器中服务宕机了,而管理员却不知道的情况。这是我们可以写一个脚本来监听本机的服务。如果服务停止或宕机了,可以自动重启这些服务。

用apache举例:

首先介绍端口扫描命令

nmap端口扫描命令,格式:nmap -sT 域名或IP

子选项:-s        扫描

                -T         扫描所有开启的TCP端口

nmap扫描后显示的端口一定是存活的。

脚本要使用nmap命令,首先用yum -y install nmap安装。

apache服务也是yum安装。

【】# 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/nullecho "$(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

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

【】# cat if-elif.sh

#!/bin/bash

read -p "Please input you filename:" file     #接收键盘输入并赋予变

量file。

if [ -z "$file" ]        #判断file变量是否为空。

then

echo "Error,please input a filename" #如果为空,输出报错信息。

elif [ ! -e "$file" ] #判断file的值是否存在。

then

echo "your input is not file"       #如果不存在,输出此信息。

elif [ -f "$file" ]      #判断file的值是否为普通文件。

thenecho "$file is a regulare file"    #如果是普通文件输出此信息。

elif [ -d "$file" ]         #判断file是否是目录文件。

then

echo "$fiel is a directory!"        #如果是目录文件输出此信息。

else           #如果都不是则执行本程序。

echo "$file is an other file!" #都不是的话输出此信息。

fi

3、多分支case条件语句

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

case语句语法如下:

case $变量名 in

“值1”)

如果$变量等于值1,则执行程序1

;;

“值2”)

如果$变量等于值2,则执行程序2

;;

....省略...

*

如果$变量的值不是以上值,则执行此程序

;;

esac

case语句需注意以下内容:

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

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

例:

[】# cat case.sh#!/bin/bash

#!/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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值