Shell脚本应用(二)

Shell脚本应用(二)

  • 条件测试操作
    • 使用if条件语句
      • 使用if语句编写脚本

条件测试操作

目的:shell 环境会根据执行命令返回后状态值($?)来判断条件是否执行成功(返回值为0 表示成功;返回值为非0 值表示失败或异常)
(一)、文件测试

选项 作用
-d 测试是否为目录(Directory)
-f 测试是否为文件(File)
-e 测试目录或文件是否存在(Exist)
-r 测试当前用户是否有权限读取(Read)
-w 测试当前用户是否有权限写入(Write)
-x 测试当前用户和是否有权限执行(Excute)

通过条件测试操作返回的预定义变量"$?"的状态值,从而判断条件是否成立。

[root@localhost ~]# [ -d /media/cdrom ]   判断/media/cdrom是否是一个目录
[root@localhost ~]# echo $? 	            查看是否成立
0 				    返回0表示条件成立
[root@localhost ~]# [ -f /media/cdrom ]   判断/media/cdrom是否是一个文件
[root@localhost ~]# echo $?		    查看是否成立
1				    返回1表示条件不成立

(二)、逻辑测试
作用:判断两个或多个条件的依赖关系
&&:逻辑与,且的意思;要求所有条件都得满足
||:逻辑或得意思;多个条件只要满足一个即可
! :逻辑否得意思;表示“不”;当指定条件不成立时,测试命令返回值为0

[root@localhost ~]# [ -e /mnt/ ] && echo "YES"     判断/mnt/目录是否存在,如果存在就输出YES
YES
[root@localhost ~]# [ -f /mnt/ ] && echo "YES" || echo "NO"   判断/mnt/是否为文件,是就输出YES,不是就输出NO
NO
[root@localhost ~]# [ ! -d /mnt/ ] && echo "YES" || echo "NO"  判断/mnt/不是目录,是就输出YES,不是就输出NO
NO

(三)、整数值比较

选项 作用
-eq 第一个数等于第二个数(Equal)
-ne 第一个数不等于第二个数(Not Equal)
-gt 第一个数大于第二个数(Greater Than)
-ge 第一个数大于或等于第二个数(Greater or Equal)
-lt 第一个数小于第二个数(Lesser Than)
-le 第一个数小于或等于第二个数(Lesser or Equal)
[root@localhost ~]# aaa=`df | wc -l`   反撇号:提取命令执行后的输出结果
[root@localhost ~]# echo $aaa
10
[root@localhost ~]# [ $aaa -gt 8 ] && echo "YES" || echo "NO"    判断aaa变量是否大于8,成立输出YES,不成立输出NO
YES
[root@localhost ~]# [ $aaa -eq 8 ] && echo "YES" || echo "NO"    判断aaa变量是否等于8,成立输出YES,不成立输出NO
NO

(四)、字符串比较
作用:用来检查用户输入、系统环境等是否满足条件;来判断用户输入的位置参数是否符合要求等
= : 第一个字符串和第二个字符串相同
!= : 第一个字符串和第二个字符串不相同 (! 就是取反)
-z: 用来检查字符串是否为空

[root@localhost ~]# [ $aaa = 10 ] && echo "YES" || echo "NO"  变量aaa等于10,则输出YES;不等于则输出NO
YES
[root@localhost ~]# [ $aaa != 10 ] && echo "YES" || echo "NO" 变量aaa不等于10,则输出YES,等于则输出NO
NO

编写一个简单脚本

[root@localhost ~]# vim fugai.sh
#!/bin/bash
read -p "是否覆盖文件:" AJBN     定义变量AJBN,并输出提示信息
[ $AJBN = yes | && echo "已覆盖" || echo "未覆盖"	
##如果输入的提示信息是yes就输出"已覆盖",否则输出"未覆盖"

使用if条件语句

通过if 条件语句,实现流程控制方式;满足某个条件时,返回一个结果,否则去实现其他的结果
(一)、单分支if 语句
条件成立,会执行相应的代码;否则不执行其他任何操作

if   [  条件表达式 ]    (判断,如果条件成立)
then  
命令序列                 (执行命令序列)
fi                        (结束判断:条件不成立,不做任何操作)

单分支流程图:
Shell脚本应用(二)_第1张图片
(二)、双分支语句
满足第一个条件做一个命令操作;除第一个条件以外的所有条件,都做第二个命令操作

if
[  条件表达式 ]
then
命令序列1
else  (除以上条件外的)
命令序列2
fi

双分支流程图:
Shell脚本应用(二)_第2张图片
(三)、多分支语句
根据测试结果的成立或不成立进行多次判断

if   条件测试1
then
命令序列1
elif  条件测试2
then  
命令序列2
elif  条件测试3
then
命令序列3
elif   条件测试n
then  
命令序列n
else
命令序列(n+1)
fi

多分支流程图:
Shell脚本应用(二)_第3张图片

使用if语句编写脚本

(一)单分支if语句应用

[root@localhost ~]# vim 1.sh
#!/bin/bash
aaa=aaa.txt                (定义一个变量)
if [ ! -e $aaa ]	   (判断aaa.txt文件不存在,判断成功后)
then
touch  $aaa		   (当判断成功后,将该文件创建出来)
fi			   (结束判断:不做任何操作)

Shell脚本应用(二)_第4张图片

[root@localhost ~]# vim 2.sh
#!/bin/bash
read -p "输入要删除文件或目录:" aaa	
if [ -e $aaa ]			判断变量aaa文件或目录是否存在,判断成功后
then
rm -rf $aaa			当判断成功后,删除变量aaa
fi				结束判断;不做任何操作

Shell脚本应用(二)_第5张图片(二)、双分支if语句应用

#!/bin/bash
read -p "请输入目标主机IP地址:" dizhi
ping -c 3 -i 0.2 -W 3 $dizhi &> /dev/null
##-c、-i、-W分别表示发送几个测试包、间隔几秒、超时几秒
if [ $? -eq 0 ]      
then
echo "Host $dizhi is up" 
else
echo "Host $dizhi is down"
fi

Shell脚本应用(二)_第6张图片

[root@localhost ~]# vim 4.sh
#!/bin/bash
systemctl status  vsftpd  &> /dev/null
if [ $? -eq 0 ]
then
echo "监听地址:$(netstat -anpt | grep vsftpd | awk '{print $4}')"
echo "进程PID号:$(pgrep -x vsftpd)"
else
echo "警告:vsftpd服务不可用"
fi
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# sh 4.sh 
监听地址::::21
进程PID号:58347
[root@localhost ~]# systemctl stop vsftpd
[root@localhost ~]# sh 4.sh 
警告:vsftpd服务不可用

Shell脚本应用(二)_第7张图片
(三)、多分支if语句应用

#!/bin/bash
read -p "请输入你的分数(0-100):" aaa  交换赋值
if [ $aaa -ge 85 ] && [ $aaa -le 100 ]  数值大于85或等于,小于100或等于
then
echo "$aaa 分,优秀!"
elif [ $aaa -ge 70 ] && [ $aaa -le 84 ]  数值大于70或等于,大于84或等于
then
echo "$aaa 分,良好"
elif [ $aaa -ge 60 ] && [ $aaa -le 69 ]  数值大于60或等于,小于69或等于
then
echo "$aaa 分,及格"
elif [ $aaa -le 59 ]			 数值小于59或等于
then
echo "$aaa 分,不及格"
else
echo "请输入0-100之间的分数"    		 当以上条件都不满足时,输出这个
fi

Shell脚本应用(二)_第8张图片

你可能感兴趣的:(shell,shell,linux,centos)