shell脚本编程之条件语句【二】(跟着小张一起走)

一. 条件测试

1.1 test命令

  • 测试表达式是否成立,若成立返回0,否则返回其他值

格式1:test+ 条件表达式(判断是否成立的条件)
格式2:【 条件表达式 】 注意:【空格 表达式 空格

1.2 文件测试

格式:【 操作符 文件或目录 】

常用操作符 说明
-d 测试是否为目录(Directory)
-e 测试目录或文件是否存在(Exist)
-f 测试是否为文件(File)
-r 测试当前用户是否有权限读取(Read)
-w 测试当前用户是否有权限写入(Write)
-x 测试当前用户是否有权限执行(eXcute)
-b 测试是否为设备文件
-c 测试是否为字符设备
-s 测试存在且文件大小为空
-L 测试是否为链接文件

经典案例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 整数值比较

格式:【 整数1 操作符 整数2 】

常用操作符 说明
-eq 等于(Equal)
-ne 不等于(Not Equal)
-lt 小于(Leser Than)
-gt 大于(Greater Than)
-le 第一个数小于或等于第二个数(Lesser or Equal)
-ge 第一个数大于或等于第二个数(Greater or Equal)

经典案例:
在这里插入图片描述
在这里插入图片描述

1.4 字符串比较

格式1:【 字符串1  =  字符串2  】
      【 字符串1=  字符串2  】
格式2:【 -z  字符串】
常用操作符 说明
= 字符串内容相同
!= 字符串内容不同,!号表示相反的意思
-z 字符串内容为空
-n 检查是否有字符串存在

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5 逻辑测试

格式一:【 表达式1 】 操作符 【 表达式2 】
格式二: 命令1 操作符 命令2

常用操作符 说明
-a或&& 逻辑与,而且的意思
-o或 ▕▕ 逻辑或,或者的意思
逻辑否

经典案例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、if条件语句结构

2.1 if单分支结构

实际上使用“&&”和“||”逻辑测试已经可以完成简单的判断并执行相应的操作,但是当需要选择执行的命令语句较多时,这种方式将使执行代码显得很复杂,不好理解。而使用专用的 if 条件语句,可以更好地整理脚本结构,使得层次分明, 清晰易懂

单分支 if 语句:对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。

在这里插入图片描述
语法:

1if 【 条件测试操作 】
then
命令序列 
fi    #注意后面有个结尾,开头结尾要凑成一对否则会报语法错误

2if 【 条件测试操作 】;then
命令序列 
fi 

经典案例:
1.
在这里插入图片描述
2.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.
在这里插入图片描述
在这里插入图片描述
4.
在这里插入图片描述
在这里插入图片描述
注意:

单个括号(【】):必须要有空格  两个字符或数字之间的比较左右必须有空格

条件判断: 
test一种形式,【】中间只能使用=!=比较字符串,如果使用<>需要进行转义\.
然后中间如果比较数字要用-lt 等符号,不能使用 \< 比较数字,他会当成字符串处理

两个括号【【 】】 :可用于处理逻辑命令,也可以处理字符串是否相等,且使用<>不用转义符

2.2 if双分支结构

双分支 if 语句只是在单分支的基础上针对“条件不成立”的情况执行另一种操作,而不是 “坐视不管”地不执行任何操作

在这里插入图片描述
语法:

if 条件
then
    指令集
else
    指令集
fi

经典案例:
1.检测网段是否存活
在这里插入图片描述在这里插入图片描述
2.

#!/bin/bash
ip=192.168.10.12
ping -c 2 -i 0.2 -W 3 $ip &> /dev/null

if [ $? -eq 0 ];then
        echo "$ip is up "
else
        echo "$ip is down"
fi

在这里插入图片描述

-c ping的次数
-i 每次多久ping一次,单位是秒
-W 反馈结果的时间,如果不通时可加快反馈时间,单位是秒

3.判断输入的用户名是否存在,存在提示已存在,不存在则创建用户并设置密码

read -p "请输入你要创建的用户名:" name
id $name &>  /dev/null
if [ $? -eq 0 ];then
        echo "该用户已存在!"
else
        useradd $name
        echo "123" | passwd --stdin $name &> /dev/null
        echo "已创建用户$name,并设置密码"
fi

在这里插入图片描述
4.开启查询apache服务

#!/bin/bash
netstat -natup | grep ":80"  &>  /dev/null //查询服务检索端口 有没有80端口的服务存在,把输出的信息放到黑洞里
if [ $? -eq 0 ];then
echo "apache服务已经运行!"
else
echo "启动httpd服务"
yum install -y httpd  &>  /dev/null
systemctl start httpd
echo "启动完成,欢迎使用Apaceh服务!"
fi

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 if多分支结构

在这里插入图片描述

多分支结构:

与单分支、双分支 if 语句相比,多分支 if 语句的结构能够根据多个互斥的条件分别执行不同的操作

if    条件
then
        指令
elif  条件
then
        指令
else
        指令
fi

经典案列:
1.需求:判断文件的类别

[root@localhost home]# vim dome6.sh

#!/bin/bash
name=/home
if [ -d $name ] && [ -r $name ];then
   echo "$name 是一个目录并且具有可读权限"
elif  [ -f $name ];then
   echo "$name 是一个文件"
elif [ -b $name ];then
   echo "$name 是一个设备文件"
else
   echo "无法判断文件类别"
fi

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.根据输入的考试分数不同来区分优秀、合格、不合格三挡

#!/bin/bash
read -p "请输入您的分数(0-100): " GRADE 
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] 
then
	echo "$GRADE 分,优秀!"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] 
then
	echo "$GRADE 分,合格!"
else
	echo "$GRADE 分,不合格!"
fi

3.罚抄案例

#!/bin/bash
read -p "请输入你的分数: " score
if [ $score -eq 100 ];then
echo "秀儿!"
elif [ $score -ge 90 ] && [ $score -lt 100 ]
then
echo "$score 分,抄10遍!"
elif [ $score -ge 70 -a $score -le 89 ]
then
echo "$score 分,抄20遍!"
elif [ $score -ge 60 -a $score -le 69 ]
then
echo "$score 分,抄30遍! "
elif [ $score -ge 0 -a $score -lt 60 ]
then
echo "$score 分,全抄30遍 !"
else
echo "输入有误!"
fi

在这里插入图片描述
在这里插入图片描述
当输入非法字符时,会显示报错!

此时你一定要注意要进行对脚本的完善,让他变的更加完美。

在这里插入图片描述

2.4 if嵌套语句

经典案例:

1.判断httpd服务有没有启动

If 判断是否启动
嵌套iF 如果启动------输出已启动
如果没启动----判断是否安装---如果安装---启动
                           如果没安装----安装---如果安装成功---启动
                                                         如果安装不成功-----报错
                                       
ps aux | grep httpd | grep -v grep   //查询过滤httpd服务

if [  $? -ne 0  ];then    //有等于0,没有不等于0
      if [ "$(rpm -q httpd)"=="未安装软件包 httpd " ];then  //如果未非0,表示没有该服务 ,则表示未安装
注意:这里等号两边不能加空格
      echo “正在Apache服务请稍等..........”
        yum -y install httpd   //则下载httpd服务
        systemctl start httpd  //开启服务
        Else            //否则就是已存在安装包,只需要直接开启httpd服务
        systemctl start httpd
        fi
else
        echo "httpd is running"  //如果为0,表示该服务正在运行
Fi

在cd 的dome4.sh里面
法一:
在这里插入图片描述
法二;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. case语句

case 语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写
case 语句主要适用于以下情况: 某个变量存在多种取值需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个 不同的条件,而 case 语句只是判断一个变量的不同取值。
在这里插入图片描述
格式:

case 变量值 in
模式 1)
	命令序列 1
;;
模式 2)
	命令序列 1
;;
* )
	默认命令序列
esac
case 行尾必须为单词“in”,每一模式必须以右括号“)”结束。
   双分号“;;”表示命令序列的结束。
   模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号 “|”表示或,如“A|B”。 
   最后的“*)”表示默认模式,其中的*相当于通配符。

case 语句的执行流程:
首先使用“变量值”与模式 1 进行比较,若取值相同则执行模式 1 后的命令序列,直到遇见双分号“;;”后跳转至 esac,表示结束分支;若与模式 1 不相匹配, 则继续与模式 2 进行比较,若取值相同则执行模式 2 后的命令序列,直到遇见双分号“;;”后 跳转至 esac,表示结束分支……依此类推,若找不到任何匹配的值,则执行默认模式“*)” 后的命令序列,直到遇见 esac 后结束分支。

3.1经典案例:

3.1.1 检查用户输入的字符类型**

#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY

case "$KEY" in
[a-z]|[A-Z])
echo "你输入的是字母"
;;
[0-9])
echo "你输入的是数字"
;;
*)
echo "你输入的是空格,*,_,等特殊字符"
esac

在这里插入图片描述
在这里插入图片描述

3.1.2 编写 apache 启动服务脚本**

#!/bin/bash
case $1 in
start)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux | grep httpd
echo "httpd start"
;;
stop)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux | grep httpd
echo "httpd stop"
;;
restart)
echo "httpd STOP......"
/usr/bin/ps aux | grep httpd
/usr/bin/systemctl $1 httpd
echo "httpd restart"
;;
status)
/usr/bin/systemctl $1 httpd
;;
*)
echo "plases input start|stop|restart|status"
esac

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.3罚抄案例

read -p " 请输入你的分数: " score
case $score in
100 )
echo "秀儿!"
;;
9[0-9])  //表示90到99
echo "$score 分,抄10遍!"
;;
[78][0-9])   //表示70到89
echo "$score 分,抄20遍!"
;;
6[0-9])   //表示60到69
echo "$score 分,抄30遍!"
;;
[0-9]|[1-5][0-9] )  //表示0-9 和10-59  |表示或
echo "$score 分,全抄30遍!"
;;
*)
echo " 输入有误! "
esac

在这里插入图片描述
在这里插入图片描述

3.1.4一年四季【1-3】是第一季度,【4-6】是第二季度,【7-9】第三季度,【10-12】第四季度

#!/bin/bash
read -p "请输入月份[ 数字1-12 ]:" m
case $m in
[1-3])
echo "当前是$m月份,为第一季度";;
[4-6])
echo "当前是$m月份,为第二季度";;
[7-9])
echo "当前是$m月份,为第三季度";;
1[0-2])
echo "当前是$m月份,为第四季度";;
*)
echo "输入有误"
esac

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3.1.5 石头剪刀布小游戏

#!/bin/bash
a=$[RANDOM%3+1]
read -p "请猜拳(1.石头 2.剪刀 3.布)" b
case "$b" in
[1])
 if [ $a -eq 1 ];then
 echo "平手,电脑出的石头";elif
 [ $a -eq 2 ];then
 echo "你赢了,电脑出的剪刀";else
 [ $a -eq 3 ]
 echo "惜败,电脑出的布"
 fi
 ;;
[2])
 if [ $a -eq 1 ];then
 echo "惜败,电脑出的石头";elif
 [ $a -eq 2 ];then
[ $a -eq 3 ]
 echo "你赢了,电脑出的布"
 fi
;;
[3])
 if [ $a -eq 1 ];then
 echo "你赢了,电脑出的石头";elif
 [ $a -eq 2 ];then
 echo "惜败,电脑出的剪刀";else
 [ $a -eq 3 ]
 echo "平手,电脑出的布"
 fi
;;
*)
 echo "请输入1-3之间的数"
esac

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

1.条件测试的语法
  - 文件测试、整数值比较、字符串比较、逻辑测试
  
2.if条件语句的语法
   - 单分支、双分支、多分支
   
3.case多分支语句的语法

猜你喜欢

转载自blog.csdn.net/weixin_59663288/article/details/124421160