条件测试与if和case语句的用法

条件测试语句

Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0(真true)时表示成功,返回值为非0值(假false)时表示失败或异常。

test命令

可以对特定条件进行测试,并根据返回值来判断条件是否成立($?返回值为 0 表示条件成立)。

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

[ 操作符 文件或目录 ]
  • 常用的测试操作符
-d: 测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
  • 案例
[root@localhost~]# [ -d /media/cdrom ]                    #返回0表示条件成立
[root@localhost~]# echo $?
0
[root@localhost~]# [ -d /media/cdrom/Server ]             #返回1表示条件不成立
[root@localhost~]# echo $?
1
[root@localhost~]# [ -d /media/cdrom ] && 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~]# who | wc -l      #查看当前系统中的用户数
      7  
      [root@localhost~]# [ $(who | wc -l) -gt 5 ] && echo "Too many."    #用户数是否 > 5
      Too many.                                           
      [root@localhost~]# [ $(who | wc -l) -gt 10 ] && echo ">=10."      #用户数是否 >=10
      
      [root@localhost ~]# free -m         #查看当前内存使用情况,显示单位为MB
                    total        used        free      shared  buff/cache   available
      Mem:           1758         762         415          10         580         769
      Swap:          4095           0        4095
      [root@localhost ~]# free -m |grep "Mem" | awk '{print $4}' #将free -m 下面Mem这一行的 
      415                                                         第四列打印出来
      [root@localhost ~]# ABC=$(free -m |grep "Mem" | awk '{print $4}') 
      [root@localhost ~]# echo $ABC                              #将打印结果复制给ABC       
      414
      [root@localhost ~]# [ $ABC -lt 1500 ] && echo "当前内存为${ABC}MB,请及时清理内存!"
      当前内存为414MB,请及时清理内存!                   #数值比较,如果小于1500则输出提示信息
      

      三、bc浮点运算

      bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk 处理。

      #!/bin/bash

      #加
      [root@localhost ~]# f=$(echo "4.3+2.5" | bc)
      [root@localhost ~]# echo "4.3+2.5=$f"
      4.3+2.5=6.8
      #减
      [root@localhost ~]# f=$(echo "4.3-2.5" | bc)
      [root@localhost ~]# echo "4.3-2.5=$f"
      4.3-2.5=1.8
      #乘
      [root@localhost ~]# f=$(echo "4.30*2.50" | bc)
      [root@localhost ~]# echo "4.3*2.5=$f"
      4.3*2.5=10.75
      #除
      [root@localhost ~]# f=$(echo "4.3/2.5" | bc )
      [root@localhost ~]# echo "4.3/2.5"=$f
      4.3/2.5=1
      #混合运算
      [root@localhost ~]# f=$(echo "4.3/(2.2-1.1)*2.5+1.1" | bc)
      [root@localhost ~]# echo "4.3/(2.2-1.1)*2.5+1.1"=$f
      4.3/(2.2-1.1)*2.5+1.1=8.6
      
      #管道符号读文件运算   
      [root@localhost ~]#echo "2+2" >13.txt
      [root@localhost ~]#cat 13.txt | bc
      4
      
      

      四、awk浮点运算

      #加
      [root@localhost ~]#f=$(awk 'BEGIN {print 1.1+2.2}')
      [root@localhost ~]#echo "1.1+2.2=$f"
      1.1+2.2=3.3
      #减
      [root@localhost ~]#f=$(awk 'BEGIN {print 2.2-1.1}')
      [root@localhost ~]#echo "2.2-1.1"=$f
      2.2-1.1=1.1
      #乘
      [root@localhost ~]#f=$(awk 'BEGIN {print 1.1*2.2}' )
      [root@localhost ~]#echo 1.1*2.2=$f
      1.1*2.2=2.42
      #除
      [root@localhost ~]#f=$(awk 'BEGIN {print 10/2 }')
      [root@localhost ~]#echo "10/2=$f"
      10/2=5
      
      #还可以这样:
      #加
      [root@localhost ~]#echo $(awk BEGIN'{print 10+5}')
      15
      #减
      [root@localhost ~]#echo $(awk BEGIN'{print 10-5}')
      5
      #乘    
      [root@localhost ~]#echo $(awk BEGIN'{print 10*5}')
      50
      #除
      [root@localhost ~]#echo $(awk BEGIN'{print 10/5}')
      2
      
      [root@localhost ~]#F=`free -m | grep "Mem:" | awk '{print$4/$2*100}'`
      [root@localhost ~]#echo ${F}%        #查看Mem:这行,第四列free空闲除以第一列total
      23.5495%                             #算出还有38%没存       
      
      
      • 五、字符串比较

      格式1[ 字符串1 = 字符串2 ][ 字符串1 == 字符串2 ]
            [ 字符串1 != 字符串2 ]
      格式2[ -z 字符串 ]    #检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串
            [ -n 字符串 ]     #检查是否有字符串存在
      
      • 常用的测试操作符
       =:字符串内容相同
      !=:字符串内容不同,!号表示相反的意思
      -z:字符串内容为空
      
      • 案例
      [root@localhost ~]# echo $LANG
      zh_CN.UTF-8
      [root@localhost ~]# [ $LANG!="en.US" ] && echo "Not en.US"    #测试当前语言环境
      Not en.US
      
      [root@localhost ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
      是否覆盖现有文件(yes/no)?yes
      [root@localhost ~]# [ $ACK="yes" ] && echo "覆盖"     #测试读入的字符是否为 yes
      覆盖
      
      [root@localhost ~]#read -p "我是不是帅哥:yes/no" ack
      我是不是帅哥:yes/no yes
      [root@localhost ~]#echo $ack
      yes
      [root@localhost ~]#[ $ack = "yes" ] && echo "帅哥"     #比较这两边的字符串,如果一直则
      帅哥                                                    输出相应结果,否则不输出
      [root@localhost ~]#[ $ack != "no" ] && echo "帅哥"
      帅哥
      
      [root@localhost ~]#[ -z $ack ] && echo "帅哥"        #因为ack不是空目录所以输出不了
      [root@localhost ~]#[ -z $ack123 ] && echo "帅哥"     #因为ack123是空目录所以能输出
      帅哥
      
      

      六、逻辑测试

    格式1[ 表达式1 ] 操作符 [ 表达式2 ] ...
    格式2[ 命令1 操作符 命令2 ]
    
    在同一个[] 中括号内,使用-a -o ,不同的[]中括号,需要使用&&|| 
          ```
    
    
  • 常用的操作符

    -a或&& :逻辑与,“而且”的意思,前后条件需都成立
    -o或|| :逻辑或,“或者”的意思,只需前后条件中一个成立
    ! :逻辑否 在这里插入图片描述
    
    
    [root@localhost ~]#a=9
    [root@localhost ~]#[ $a -lt 10 ] && [ $a -gt 5 ]     #a小于10 且大于5
    [root@localhost ~]#echo $?                           #显示正确
    0                                              
    [root@localhost ~]#[ $a -lt 10 ] && [ $a -gt 10 ]   #a小于10 且大于10
    [root@localhost ~]#echo $?                          #不成立 显示错误
    1
    [root@localhost ~]#[ $a -lt 10 ] -o [ $a -gt 10 ]   #一个中括号中间放 -o
    -bash: [: 参数太多                                   #显示执行不了
    [root@localhost ~]#[ $a -lt 10  -o  $a -gt 10 ]    #一个中括号中间放 -o
    [root@localhost ~]#echo $?                         #可以执行
    0
    
    
    &&||操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错
    
    [root@localhost ~]#[[ $a -lt 10 && $a -gt 5 ]] 
    [root@localhost ~]#echo $?
    0                                                   # &&||操作符能够正常存在于[[]]条件判
    [root@localhost ~]#[ $a -lt 10 && $a -gt 5 ]     断结构中,但是如果出现在[]结构中的话会报错
    -bash: [: 缺少 `]'                                    
    

在这里插入图片描述

if语句

​ 一、if语句单分支结构

if  条件测试操作
  then    命令序列
fi

在这里插入图片描述

例:判断挂载点目录,若不存在则自动创建:
在这里插入图片描述
在这里插入图片描述

二、双分支 if 语句

1. if 条件测试操作
2. then
3. 命令序列 1
4. else
5. 命令序列 2
6. fi

在这里插入图片描述

三、多分支 if 语句

1. if 条件测试操作 1
2. then
3. 命令序列 1
4. elif 条件测试操作 2
5. then
6. 命令序列 2
7. [else]
8 [命令序列 3]
9 fi

在这里插入图片描述

例题:
提示用户输入考试分数,要求判断分数大于60或小于60,小于分数60的都淘汰,大于60的都过关,并判断男女性别,男生进入男生组,女生进入女生组,输入错误则提示错误。
在这里插入图片描述

case语句

case多分枝结构

1. case 变量值 in
2. 模式 1)
3. 命令序列 1
4. ;;
5. 模式 2)
6. 命令序列 2
7. ;;
8. ……
9. 
10.*)
11.默认命令序列
12.esac

case语句注意事项

  1. case行首必须以单词“in”,每一模式必须以单个右括号")"结束

  2. 双分号";;"表示命令序列的结束

  3. 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以使用竖杠|表示或,比如a|b

  • 最后的*)表示默认模式,其中的*相当于通配符

例题:
提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其他字符则提示重新输入,并判断男女性别,男生进入男生组,女生进入女生组,输入错误则提示错误。
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值