概述
目录
一、条件判断
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
最后
以上就是优雅砖头为你收集整理的shell基础--条件判断if和case一、条件判断二、if条件判断的全部内容,希望文章能够帮你解决shell基础--条件判断if和case一、条件判断二、if条件判断所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复