Shell编程之条件语句(if语句、case分支语句)

条件测试

  • test命令
    测试表达式是否成立,若成立返回0,否则返回其他其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]  

文件测试与整数测试

  • 文件测试
[ 操作符 文件或者目录 ]
  • 常用的测试操作符
    -d: 测试是否为目录(Directory)
    -e: 测试目录或文件是否存在(Exist)
    -f: 测试是否为文件(File)
    -r: 测试当前用户是否有权限读取(Read)
    -W:测试当前用户是否有权限写入(Write)
    -X: 测试当前用户是否有权限执行(eXcute)
[root@localhost ~]# [ -d /media/cdrom ]
[root@localhost ~]# echo $?
1					#返回1表示条件不成立
[root@localhost ~]# [ -d /opt/ ]
[root@localhost ~]# echo $?
0					#返回0表示条件成立
[root@localhost ~]# [ -d /opt/ ]&& echo "yes"			#&&逻辑与,而且的意思
yes										
  • 条件测试
    整数值比较
整数1 操作符 整数2

常用的测试操作符
-eq: 等于(Equal)
-ne: 不等于(Not Equal)
-gt: 大于(Greater Than)
-lt: 小于(Lesser Than)
-le: 小于或等于(Lesser or Equal)
-ge: 大于或等于(Greater or Equal)

[root@localhost ~]# [ 55 -lt 80 ] && echo "yes"			#55小于80  yes
yes
  • 字符串比较
格式1 :[ 字符串1 = 字符串2 ]
			  [ 字符串1 != 字符串2 ]
格式2: [ -z 字符串 ]

常用的测试操作符

=:字符串内容相同
!=:字符串内容不同,!号表示相反的意思
-z:字符串内容为空

[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "EN" ]&&echo "no"
no

[root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/n)?yes
[root@localhost ~]# [ $ACK = "yes" ] && echo "覆盖"			#测试读入的字符串是否为yes
覆盖

逻辑测试

格式1:[ 表达式1 ] 操作符 [ 表达式2 ]....
格式2:命令1  操作符  命令2   ...

常用的测试操作符
-a或&&:逻辑与,"而且"的意思
-o或|:逻辑或,“或者”的意思
!:逻辑否

[root@localhost ~]# [ -d /etc/ ] && [ -r /etc/ ]&& echo "yes"
yes

if语句

if单分支语句

单分支结构(基本格式)
if 条件测试操作
	then  命令序列
fi

单分支结构(举例)
if 磁盘已用空间>80%
	then  报警
fi

在这里插入图片描述

[root@localhost ~]# vim 111.sh
#!/bin/bash
read -p "请输入目录位置:" AAA		
if [ ! -d $AAA ]		#当目录不存在是进行
        then
                mkdir -p $AAA		#创建输入的目录
fi

[root@localhost ~]# . 111.sh 
请输入目录位置:QQ
[root@localhost ~]# ls
111.sh  anaconda-ks.cfg  QQ

if双分支语句

双分支结构(基本格式)
if 条件测试操作
	then  命令序列1
	else  命令序列2
fi

双分支结构(举例)
if 80端口是否在监听
	then  网站服务已在运行
	else  启动httpd服务
fi

在这里插入图片描述

判断目标主机是否存活,显示检测结果
[root@localhost opt]# vim 1111.sh
#!/bin/bash
read -p "请输入IP地址" A
ping -c 3 -i 0.2 -W 3 $A &> /dev/null			#-c  -i  -W 选项分别指定只发送三个测试包、间隔0.2秒、超时三秒
if [ $? -eq 0 ]
 then
   echo "host $A is up."
 else
   echo "host $A is down."
fi

[root@localhost opt]# . 1111.sh 
请输入IP地址10.0.0.1
host 10.0.0.1 is down.				#判断ping命令的检测结果,分别给出不同提示
[root@localhost opt]# . 1111.sh 
请输入IP地址192.168.100.1
host 192.168.100.1 is up.

if多分支语句

多分支结构(基本格式)
if 条件测试操作1
	then  命令序列1
elif  条件测试操作2
	then  命令序列2
else
	命令序列3
fi

多分支结构(举例)
if 分数为85~100之间
	then  判为优秀
elif  分数为70~84之间
	then  判为合格
else
	判为不合格
fi

在这里插入图片描述

[root@localhost opt]# vim abc.sh
#!bin/bash
read -p "请输入成绩:" score
if [ $score -ge 85 ] && [ $score -le 100 ]
 then
   echo "成绩优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
 then
   echo "成绩合格"
else echo "请重修"
fi

[root@localhost opt]# . abc.sh 
请输入成绩:85						#判断分数所在区间,给出不同的分档结果
成绩优秀
root@localhost opt]# . abc.sh 
请输入成绩:74
成绩合格
[root@localhost opt]# . abc.sh 
请输入成绩:4
请重修

case分支语句

针对变量的不同取值,分别执行不同的命令序列

这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值

格式:
case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	....
*)
	默认命令序列
esac
————————————————————
实例:
case 控制指令 in
start)
	启动XX服务
	;;
stop)
	停止XX服务
	;;
	....
*)
	显示服务脚本的用法
esac

在这里插入图片描述

[root@localhost opt]# vim panduan.sh
#!/bin/bash
read -p "请输入一个字符:" aa
case "$aa" in
[0-9])						#匹配任意数字
        echo "你输入的是数字"
        ;;
[a-z]|[A-Z])				#匹配任意字母
        echo "你输入的是字母"
        ;;
*)							#匹配任意符号
        echo "你输入的是符号"
esac
~  
[root@localhost opt]# chmod +x panduan.sh 
[root@localhost opt]# ./panduan.sh 
请输入一个字符:3
你输入的是数字
[root@localhost opt]# ./panduan.sh 
请输入一个字符:e
你输入的是字母
[root@localhost opt]# ./panduan.sh 
请输入一个字符:#
你输入的是符号

猜你喜欢

转载自blog.csdn.net/CN_PanHao/article/details/107388929