站保站

服务市场
  • 网站市场
  • 单机游戏
  • 平台大厅
  • 转让市场
  • 发卡市场
  • 广告市场
  • 下载市场
  • 收录市场
  • 本站平台
    平台客服
    微信Q群



    平台微博/weibo    平台微信/公众号    平台抖音/快手   
    曝光台    保障    地图   
    上传资源 快速赚钱
    站保站    登录      |  注册  |  

    只需一步,快速开始!

     找回密码   |   协议
    热门搜索: 网站开发 App报毒 挖矿源码 代办资质

    Shell编程的条件语句

    • 时间:2020-10-26 00:13 编辑:实在不知道怎么写博客 来源: 阅读:51
    • 扫一扫,手机访问
    摘要:

    前言

    • 在简单的shell脚本程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程。
    • 但是,单一的顺序结构使得脚本过于机械化,不够“智能”,难以处理更加领过的系统任务。

    一:条件测试

    1.1:文件测试

    1.1.1:test命令

    • test命令:测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值
      命令基本格式
      格式一:test 条件表达式
      格式二:[ 条件表达式 ] ‘两端要有空格,此法更为常用’

    1.1.2:文件测试

    文件测试基本格式
    [ 操作符 文件或目录 ] ‘注意两端空格’
    &? 返回0表示条件成立,返回非零值表示条件不成立
    && 逻辑与,"而且"的意思
    || 逻辑或,"或者"的意思
    在这里插入图片描述
    举例

    [root@localhost opt]# cd aaa
    [root@localhost aaa]# ls
    [root@localhost aaa]# mkdir ccc
    [root@localhost aaa]# ls
    ccc
    [root@localhost aaa]# test -d ccc
    [root@localhost aaa]# echo $?
    0
    [root@localhost aaa]# test -f ccc
    [root@localhost aaa]# echo $?
    1
    [root@localhost aaa]# touch bbb.txt
    [root@localhost aaa]# ls
    bbb.txt  ccc
    [root@localhost aaa]# test -f bbb.txt 
    [root@localhost aaa]# echo $?
    0
    [root@localhost aaa]# [ -d ccc ]
    [root@localhost aaa]# echo $?
    0
    [root@localhost aaa]# [ -x ccc ]
    [root@localhost aaa]# echo $?
    0
    [root@localhost aaa]# ls -l
    total 0
    -rw-r--r--. 1 root root 0 Nov 26 15:18 bbb.txt
    drwxr-xr-x. 2 root root 6 Nov 26 15:17 ccc
    [root@localhost aaa]# useradd lisi
    [root@localhost ~]# echo "123123" | passwd --stdin lisi
    更改用户 lisi 的密码 。
    passwd:所有的身份验证令牌已经成功更新。
    [root@localhost ~]# su - lisi
    最后一次失败的登录:二 11月 26 15:28:39 CST 2019pts/0 上
    最有一次成功登录后有 1 次失败的登录尝试。
    [lisi@localhost aaa]$ [ -w ccc ]
    [lisi@localhost aaa]$ echo $?
    1
    [lisi@localhost aaa]$ [ -r ccc ]
    [lisi@localhost aaa]$ echo $?
    0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    使用$?可以判断进一步的条件测试结果,但是操作比较繁琐,结合&&能更直观的查看测试结果

    [lisi@localhost aaa]$ [ -r ccc ] && echo "yes"
    yes
    [lisi@localhost aaa]$ [ -w ccc ] && echo "yes"
    [lisi@localhost aaa]$ 
    [lisi@localhost aaa]$ [ -w ccc ] || echo "yes"
    yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    整数测试

    整数值比较
    命令基本格式
    [ 整数1 操作符 整数2 ]
    常用的测试操作符
    在这里插入图片描述
    具体用法

    [lisi@localhost aaa]$ [ 5 -gt 3 ] && echo "yes"   测试5是否大于3  如果是就输出yes
    yes
    [lisi@localhost aaa]$ [ 5 -gt 6 ] && echo "yes"
    [lisi@localhost aaa]$ [ 5 -le 6 ] && echo "yes"
    yes
    [lisi@localhost aaa]$ [ 5 -le 3 ] && echo "yes"
    [lisi@localhost aaa]$ 
    判断当前可用的空闲内存 
    [root@localhost opt]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:           1823         692          82           9        1048         908
    Swap:          4095           0        4095
    [root@localhost opt]# free -m | grep "Mem" | awk '{print $4}'
    82
    [root@localhost opt]# ddd=$(free -m | grep "Mem" | awk '{print $4}')
    [root@localhost opt]# echo $ddd
    84
    [root@localhost opt]# [ $(free -m | grep "Mem" | awk '{print $4}') -gt 100 ] && echo "yes"
    [root@localhost opt]# [ $(free -m | grep "Mem" | awk '{print $4}') -gt 80 ] && echo "yes"
    yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    字符串与逻辑测试

    字符串比较
    常用的格式
    格式一:[ 字符串1 = 字符串2 ]
    [ 字符串1 != 字符串2 ]
    格式二:[ -z 字符串 ]
    在这里插入图片描述
    举例

    [root@localhost~]echo $LANG    //查看当前的语言环境
    zh_CN.UTF-8
    [root@localhost~]#[ $LANG!="en.US" ] && echo"Not en.US"
                                                                             //字符串测试结果(不等于)
    Not en.US
    (2)
    [root@localhost opt]# vim 33.sh
    #!/bin/bash
    read -p "是否创建/opt/share目录:(yes/no)" ack
    [ $ack = yes ] && mkdir /opt/share   (测试变量ack的值是否为yes) 如果是的话在opt目录下创建一个share文件
    echo "创建成功"
    [root@localhost opt]# ./33.sh 
    是否创建/opt/share目录:(yes/no)yes
    创建成功
    [root@localhost opt]# ls
    33.sh    rh  share  
    [root@localhost opt]# vim 44.sh
    #!/bin/bash
    [ -d /opt/demo ] && echo "已经存在" || mkdir /opt/demo && echo "创建成功"
    [root@localhost opt]# ./44.sh 
    创建成功
    [root@localhost opt]# ls
    33.sh    rh  share  44.sh demo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    逻辑测试

    基本格式
    格式一: [ 表达式1 ] 操作符 [ 表达式2 ] …
    格式二: 命令1 操作符 命令2
    在这里插入图片描述

    [root@localhost opt]# [ -d /opt/demo ] && echo "yes"  //demo是否为目录如果是输出yes
    yesa
    [root@localhost opt]# [ ! -d /opt/demo ] && echo "yes"  //demo不是目录输出yes
    [root@localhost opt]# [ 1 -eq 1 ] && [ 2 -eq 2 ] && echo "yes"
    yes
    [root@localhost opt]# [ 1 -eq 1 -a 2 -eq 2 ] && echo "yes"		'-a和-o也可使用在[]中,更加方便'
    yes
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    一元运算符,二元运算符和三元运算符

    一元运算符
    带一元运算符的表达式遵循从右到左的结合性,常见的一元表达式:++一元表达式,–一元表达式
    前缀自增运算符与前缀自减运算符
    在一元表达式的前面添加运算符++或–后得到的表达式是一个一元表达式。操作数将被加1(++)或减1(–),表达式的值是经过加1、减1 以后的值。操作数必须是一个左值。
    i=1;
    i++: i=$i+1
    i=i++:先赋值在运算
    i=++i:先自加在赋值
    i=–i:先自减在赋值

    举例

    [root@localhost opt]# i=1
    [root@localhost opt]# echo $i
    1
    [root@localhost opt]# let i=++i
    [root@localhost opt]# echo $i
    2
    [root@localhost opt]# let i+=2 	'相当于i=i+2'
    [root@localhost opt]# echo $i
    4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二元运算符
    a + b = c
    三元运算符
    条件&&结果1 || 结果2

    二:if语句

    2.1:if单分支语句

    单分支结构(基本格式)

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

    单分支结构(举例)
    if 磁盘已用空间>80%
    then 报警
    fi
    在这里插入图片描述
    根据$?判断
    exit 1 异常退出
    exit 0 正常退出
    举例演示

    [root@localhost opt]# vim eee.sh
    #!/bin/bash
    dir ="/opt/demo02"a
    if [ ! -d $dir ]	'若不存在/opt/demo2,则执行下述命令'
     then
            mkdir -p $dir
            echo "$dir创建成功"
    fi
    [root@localhost opt]# chmod +x eee.sh 
    [root@localhost opt]# ./eee.sh 
    /opt/demo02创建成功
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    if双分支语句

    双分支结构(基本格式)
    if 条件测试操作
    then 命令序列1
    else 命令序列2
    fi
    双分支结构(举例)
    if 80端口是否在监听
    then 网站服务已在运行
    else 启动httpd服务
    fi
    在这里插入图片描述
    举例1:

    [root@localhost opt]# vim eee.sh
    #!/bin/basha
    dir="/opt/demo02"
    if [ ! -d $dir ]
     then
            mkdir -p $dir
            echo "$dir创建成功"
      else
            echo "$dir已存在"
    fi
    [root@localhost opt]# ./eee.sh 
    /opt/demo02已存在
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    举例2:查看目标主机是否存活,显示检测结果

    [root@localhost opt]# vim fff.sh
    #!/bin/bash
    read -p "请输入IP地址:" addr
    ping -c 3 -i 0.2 -W 3 $addr &> /dev/null   将信息放入黑洞
    if [ $? -eq 0 ]
            then
                    echo "$addr is up"
            else
                    echo "$addr is down"
    fi
    [root@localhost opt]# chmod +x fff.sh 
    [root@localhost opt]# ./fff.sh 
    请输入IP地址:192.168.100.1      
    192.168.100.1 is down
    [root@localhost opt]# ./fff.sh 
    请输入IP地址:192.168.197.1
    192.168.197.1 is up
    其中:
    -c:发送三个包
    -i: 发包间隔0.2秒
    -W:等待时间3秒
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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 ggg.sh
    #!/bin/bash
    read -p "请输入成绩:" score
    if [ $score -lt 0 ] || [ $score -gt 100 ]
      then
            echo "输入有误"
            exit 1;
    elif [ $score -ge 85 ] && [ $score -le 100 ]
      then
            echo "成绩优秀"
    elif [ $score -ge 70 ] && [ $score -le 84 ]
      then
            echo "成绩合格"
    else
            echo "成绩不合格"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    [root@localhost opt]# ./ggg.sh 
    请输入成绩:100
    成绩优秀
    [root@localhost opt]# ./ggg.sh 
    请输入成绩:82
    成绩合格
    [root@localhost opt]# ./ggg.sh 
    请输入成绩:53  
    成绩不合格
    [root@localhost opt]# ./ggg.sh 
    请输入成绩:111
    输入有误
    [root@localhost opt]# ./ggg.sh 
    请输入成绩:-23
    输入有误
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    case多分支语句

    case语句的结构

    • 针对变量的不同取值,分别执行不同的命令序列
    • 这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值
      case语句是匹配模式,一个模式对应一组命令,相当于大仓库一样,想调用哪个命令就调用哪一条命令
      双分号;;表示命令序列的结束
      格式:
    case 变量值 in
    模式1)
    	命令序列1
    	;;
    模式2)
    	命令序列2
    	;;
    	....
    *)
    	默认命令序列
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    实例:

    case 控制指令 in
    start)
    	启动XX服务
    	;;
    stop)
    	停止XX服务
    	;;
    	....
    *)
    	显示服务脚本的用法
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    1.2:case语句的实例

    1.2.1:创建一个判断输入类型的脚本

    • 提示用户输入一个字符
    • 判断出该字符是字母,数字或者其他字符
    [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 
    请输入一个字符:#
    你输入的是符号
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    1.2.2:判断学生成绩的优良

    成绩0-100分
    0-59分:不及格
    60-74:及格
    75-84:良好
    85-100:优秀

    [root@localhost opt]# vim chengji.sh 
    #!/bin/bash
    read -p "请输入你的成绩:" aa
    case "$aa" in
    #[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])
    [1-5][0-9]|[0-9])
            echo "你的成绩不合格"
            ;;
    6[0-9]|7[0-4])    //方括号里表示一个连续的范围,这个范围只能是0-9
            echo "你的成绩合格"
            ;;
    7[5-9]|8[0-4])
            echo "你的成绩良好"
            ;;
    8[5-9]|9[0-9]|100)
            echo "你的成绩优秀"
            ;;
    *)
            echo "输入有误"
    esac
    ~       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:0           
    你的成绩不合格
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:59
    你的成绩不合格
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:60
    你的成绩合格
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:74
    你的成绩合格
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:75
    你的成绩良好
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:84
    你的成绩良好
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:85
    你的成绩优秀
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:100
    你的成绩优秀
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:101
    输入有误
    [root@localhost opt]# ./chengji.sh 
    请输入你的成绩:-1
    输入有误
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 全部评论(0)
    • 最新

    信息加载中,请等待

    微信客服(速回)

    微信客服(慢回)



    企业微信客服二维码
    联系我们
    平台客服: 平台QQ客服

    平台电话:400电话迁移中!

    平台邮箱:28292383@qq.com

    工作时间:周一至周五:早10:00 晚:18:00

    营业执照     网站ICP备案:鲁ICP备20027607号-1     鲁公网安备:37068702000078号     增值电信业务经营许可证、在线数据与交易处理业务许可证:鲁B2-20200681      © 2016-2024 站保站  https://www.zhanbaozhan.com/ 版权所有!      平台规范:   关于我们   广告合作   隐私条款   免责声明   法律声明   服务条款   网站地图   平台工单!