天天看点

Shell 脚本攻略--条件语句(条件测试、if、case)前言一、条件测试—字符串比较二、条件测试—逻辑测试三、if语句四、case分支语句

文章目录

  • 前言
  • 一、条件测试—字符串比较
  • 二、条件测试—逻辑测试
  • 三、if语句
    • 1.单分支
    • 2.双分支
    • 3.多分支
  • 四、case分支语句
    • 1.基本格式
    • 2.示例1
    • 示例2:淘宝购物

前言

我们前面已经学习了编写比较简单的shell脚本:各语句按照顺序依次来执行,从而实现“批量处理”的自动化过程,然而,这样比较“单一”的顺序结构写多了,你会不会觉得简单了点?这样,脚本过于机械化,像流水线一样,不够“智能”!那么,怎样才能从容的应对复杂的系统任务呢?我们接下来去学习如何进行条件测试操作,并通过正确使用if语句,从而使shell脚本具备一定的“判断”能力,从而能根据不同的条件来完成不同的管理任务

一、条件测试—字符串比较

  • 通常用来检查用户输入、系统环境是否满足条件
基本格式:
格式1
[ 字符串1 = 字符串2 ]
[ 字符串1 !=字符串2 ]
格式2
[ -z 字符串 ]
           
常用的测试操作符 解释
= 第一个字符串与第二个字符串内容相同
!= 第一个字符串与第二个字符串内容不同,!号表示相反的意思
-z 检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串
[[email protected] ~]# read -p "哑铃是不是柴犬:(yes/no)" chai
哑铃是不是柴犬:(yes/no)yes
[[email protected] ~]# [ $chai = "yes" ] && echo "柴犬哑铃"
柴犬哑铃                      #若输入的'yes'则输出'柴犬哑铃'
[[email protected] ~]# [ $chai != "no" ] && echo "柴犬哑铃"
柴犬哑铃                       #若输入的不是'no'则输出'柴犬哑铃'
[[email protected] ~]# [ -z $chai ] && echo "柴犬哑铃" 
[[email protected] ~]#            #若不成立则不显示任何内容
           

二、条件测试—逻辑测试

  • 判断两个或多个条件之间的依赖关系
  • 当系统任务取决于多个不同的条件的时候,判断是根据这些条件同时成立还是只要其中一个成立等情况
基本格式:
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
           

常用测试操作符:

-a或&&:逻辑与,“而且”的意思,得前后条件都符合

-o或||:逻辑或,“或者” 的意思,二者其中符合一即可

!:逻辑否,只有当指定的条件不成立的时候,结果才成立

“&&”、“||”操作符能够正常存在于“[[]]”条件判断结构中,但是如果出现在“[]”结构中会报错

[[email protected] ~]# a=6								#为变量赋值
[[email protected] ~]# [ $a -ne 2 ] && [ $a -lt 8 ]	  #6不等于2而且6小于8
[[email protected] ~]# echo $?
0
[[email protected] ~]# [ $a -eq 1 ] && [ $a -lt 8 ]	  #6等于1而且6小于8
[[email protected] ~]# echo $?
1
[[email protected] ~]# [ $a -ne 1 -a $a -lt 8 ]           #-a的用法
[[email protected] ~]# echo $?
0
[[email protected] ~]# [[ $a -ne 1 && $a -lt 8 ]]		 #&&的[[]]用法
[[email protected] ~]# echo $?
0
[[email protected] ~]# [[ $a -ne 1 && $a -lt 8 ]] && echo 1111
1111                                         #不等于1且小于8就会输出1111 


           

三、if语句

1.单分支

##基本格式
if 条件测试操作
    then  命令序列
fi
           
  • 示例
[[email protected] ~]# vim xjj.sh

#!/bin/bash

xjj="xjj.txt"        ##这里可以先设变量

if [ ! -e $xjj ]        ##若文件不存在,则执行下述命令
 then
        touch $xjj
        echo "$xjj创建成功"
fi
[[email protected] ~]# chmod +x xjj.sh 
[[email protected] ~]# . xjj.sh 
此文件xjj.txt已经创建成功!

           
Shell 脚本攻略--条件语句(条件测试、if、case)前言一、条件测试—字符串比较二、条件测试—逻辑测试三、if语句四、case分支语句
Shell 脚本攻略--条件语句(条件测试、if、case)前言一、条件测试—字符串比较二、条件测试—逻辑测试三、if语句四、case分支语句

2.双分支

##基本格式
if 条件测试操作
	then  命令序列1
	else  命令序列2
fi
           
  • 若条件成立,则执行then后面的命令,忽略else,直到fi结束
  • 若条件不成立,则忽略then,跳至else后面的命令序列执行,直到fi结束
  • 示例1
#!/bin/bash

cd /opt
a="xjj.txt"
b="jyj"
c="xcf.txt"

if [ -d $b ]		   #如果/opt下面如果有jyj这个目录,则执行下述命令
 then                
     cd $b
     touch $a
     echo "$a 已创建"
 else				   #如果没有,则执行下述命令
     cd /opt
     mkdir $b
     cd $b
     touch $c
     echo "目录$a 和文件$c已创建"
fi

--
[[email protected] ~]# . 11.sh 
目录jyj 和文件xjj.txt 已创建              #第一次执行的结果

--
[[email protected] ~]# . 11.sh 
xjj.txt 已创建
[[email protected] jyj]# pwd
/opt/jyj                                 #第二次执行的结果
           
  • 示例2 if 80端口是否在监听,then 网站服务已在运行,else启动httpd服务,fi
#!/bin/bash

JJ=`netstat -lnautp | grep "80"`

if [[ $JJ && $? -eq 0 ]];
then
    echo "网站服务已在运行"

else
    yum -y install httpd &> /dev/null
    
    echo "网站服务已启动"

fi
#验证结果:
[[email protected] ~]# vim 22.sh
[[email protected] ~]# . 22.sh 
网站服务已启动
[[email protected] ~]# netstat -lanutp | grep 80
tcp        0      0 192.168.126.15:45790    39.173.174.242:80       TIME_WAIT   -                   

           

3.多分支

##基本格式
if 条件测试操作1
	then  命令序列1
elif  条件测试操作2
	then  命令序列2
else
	命令序列3
fi
           
  • 示例:

    每章学完会默写本章学习的知识点,每个阶段学习结束后会有阶段测试,默写和测试不合格者会有相应惩罚

    惩罚规则如下:

    90-100 错题 抄 10

    80-89 错题 抄 20

    60-79 错题 抄 30

    60以下 全抄 30

#!/bin/bash

read -p "请输入你的成绩(0~100):" xjj

if [ $xjj -ge 90 ] && [ $xjj -le 100 ]
        then
                echo "抄10遍"

elif [ $xjj -ge 80 ] && [ $xjj -le 89 ]
        then
                echo "抄20遍"
elif [ $xjj -ge 60 ] && [ $xjj -le 79 ]
        then
                echo "抄20遍"
else
                echo "全部抄30遍"

fi

--
[[email protected] ~]# vim chao.sh
[[email protected] ~]# . chao.sh 
请输入你的成绩(0~100):101
全部抄30遍
[[email protected] ~]# . chao.sh 
请输入你的成绩(0~100):90
抄10遍
[[email protected] ~]# . chao.sh 
请输入你的成绩(0~100):80
抄20遍
[[email protected] ~]# . chao.sh 
请输入你的成绩(0~100):66
抄30遍
           

四、case分支语句

  • case语句主要用于以下场景:当每个变量存在多种取值时,需要对其中的每一种取值分别执行不同的命令序列
  • if语句是要判断多个不同条件,而case判断一个变量的不同取值

1.基本格式

case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	....
*)
	默认命令序列
esac
           
  • case行尾必须为单词 in ,每一行必须以括号“)”结束
  • 双分号“;;”表示命令序列结束
  • 可以用方括号“[]”表示一个连续的范围;还可以用“|”表示,比如“A|B”
  • 最后的“)*”表示默认模式,如果以上取值都不相同,则执行此行

2.示例1

每章学完会默写本章学习的知识点,每个阶段学习结束后会有阶段测试,默写和测试不合格者会有相应惩罚

惩罚规则如下:

90-100 错题 抄 10

80-89 错题 抄 20

60-79 错题 抄 30

60以下 全抄 30

#!/bin/bash

read -p "请输入你的分数:" xjj
case $xjj in
  
9[0-9]|100)
        echo "错题抄10遍" ;;

8[0-9])
        echo "错题抄20遍" ;;      
6[0-9]|7[0-9]) 
        echo "错题抄30遍" ;;      
*)        
        echo "全部抄30遍"

esac    
           
  • 验证结果
[[email protected] ~]# vim 33.sh
[[email protected] ~]# . 33.sh 
请输入你的分数:1000
全部抄30遍
[[email protected] ~]# . 33.sh 
请输入你的分数:50
全部抄30遍
[[email protected] ~]# . 33.sh 
请输入你的分数:68
错题抄30遍
[[email protected] ~]# . 33.sh 
请输入你的分数:88
错题抄20遍
[[email protected] ~]# . 33.sh 
请输入你的分数:99
错题抄10遍
           

示例2:淘宝购物

1 #!/bin/bash
  2 
  3 sum=0
  4 
  5 for ((;;))
  6 do
  7 
  9 
 10 read -p "请选择您想要购买的商品:" sg
 11 
 12 case $sg in
 13 1)
 14         echo "您已购买了一件大衣,花费1000元"
 15         let sum+=1000
 16 ;;
 17 2)
 18         echo "您已购买了一条保暖裤,花费500元"
 19         let sum+=500
 20 ;;
 21 3)
 22         echo "您已购买了一双作战靴,花费250元"
 23         let sum+=250
 24 ;;
 25 4)
 26         echo "您已购买了一顶丛林迷彩帽,花费150元"
 27         let sum+=150
 28 ;;
 29 5)
 30         echo "您已购买了一双冬袜,花费50元"
 31         let sum+=50
 32 ;;
 33 *)
 34         echo "您本次消费共计$sum元,欢迎下次光临~"
 35         break
 36 esac
 37 
 38 read -p "您选择继续购物还是结算购物车?(yes/no)" pay
 39 
 40 if [ $pay = yes ]
 41         then
 42                 continue
 43 elif [ $pay = no ]
 44         then
 45                 echo "欢迎下次光临,您本次购物共计消费$sum元"
 46                 break
 47 else
 48         echo "请您正确输入"      
 49 fi
 50 
 51 done
           
[[email protected] ~]# vim taobao.sh
[[email protected] ~]# . taobao.sh 
1:军大衣:1000元,2:保暖裤500元,3:作战靴250元,4:丛林迷彩帽150,5:冬袜50元
请选择您想要购买的商品:1
您已购买了一件大衣,花费1000元
您选择继续购物还是结算购物车?(yes/no)yes
1:军大衣:1000元,2:保暖裤500元,3:作战靴250元,4:丛林迷彩帽150,5:冬袜50元
请选择您想要购买的商品:4
您已购买了一顶丛林迷彩帽,花费150元
您选择继续购物还是结算购物车?(yes/no)yes
1:军大衣:1000元,2:保暖裤500元,3:作战靴250元,4:丛林迷彩帽150,5:冬袜50元
请选择您想要购买的商品:5
您已购买了一双冬袜,花费50元
您选择继续购物还是结算购物车?(yes/no)no
欢迎下次光临,您本次购物共计消费1200元