zoukankan      html  css  js  c++  java
  • Shell脚本编程基础之shell脚本条件测试命令

    条件测试

    • 判断某个条件是否满足,需要由测试机制来实现

    • 专用的测试表达式需要由测试命令辅助完成

    • 实现评估不二生命,一边用在条件性环境下进行执行

    条件状态

    • 若真,则状态码变量 $? 返回0
    • 若假,则状态码变量 $? 返回1

    条件测试命令

    • test 表达式
    • [ 表达式 ] #和test等价,建议使用[ ]
    • [[ 表达式 ]] #相当于增强版的[ ]

    注意:表达式前后必须有空白字符

    test

    [05:19:35 root@C8-3-55 ~]#help test
    test: test [表达式]
        对条件表达式进行估值。
    
        根据 EXPR 表达式的估值以状态 0 (真) 或 1 (伪) 退出。
        表达式可以是一元或者二元的。一元表达式通常用于检测
        文件状态。同时还有字符串操作符和数字比较操作符。
    
        文件操作符:
    
          -a 文件        如果文件存在则为真。
          -b 文件        如果文件为块特殊文件则为真。
          -c 文件        如果文件为字符特殊文件则为真。
          -d 文件        如果文件为目录则为真。
          -e 文件        如果文件存在则为真。
          -f 文件        如果文件存在且为常规文件则为真。
          -g 文件        如果文件的组属性设置打开则为真。
          -h 文件        如果文件为符号链接则为真。
          -L 文件        如果文件为符号链接则为真。
          -k 文件        如果文件的粘滞 (sticky) 位设定则为真。
          -p 文件        如果文件为命名管道则为真。
          -r 文件        如果文件对于您是可读的则为真。
          -s 文件        如果文件存在且不为空则为真。
          -S 文件        如果文件是套接字则为真。
          -t 文件描述符   如果文件描述符在一个终端上打开则为真。
          -u 文件        如果文件的用户数行设置打开则为真。
          -w 文件        如果文件对您是可写的则为真
          -x 文件        如果文件对您是可执行的则为真。
          -O 文件        如果文件是被您所有的则为真。
          -G 文件        如果文件被您的组所有则为真。
          -N 文件        如果文件上次被读取之后修改过则为真。
    
          FILE1 -nt FILE2  如果 file1 文件新于 file2 文件则为真(根据
                           修改日期)。
    
          FILE1 -ot FILE2  如果 file1 文件旧于 file2 文件则为真。
    
          FILE1 -ef FILE2  如果 file1 文件是 file2 文件的硬链接则为真。
    
        字符串操作符
    
          -z 字符串      如果字符串为空则为真。
    
          -n 字符串
             字符串      如果字符串不为空则为真。
    
          STRING1 = STRING2
                         如果 string1 和 string2 字符串相同则为真。
          STRING1 != STRING2
                         如果 string1 和 string2 字符串不相同则为真。
          STRING1 < STRING2
                         如果按字典排序 string1 在 string2 串之前则为真。
          STRING1 > STRING2
                         如果按字典排序 string1 在 string2 串之前则为真。
    
        其他操作符:
    
          -o 选项        如果指定 shell 选项启用则为真。
          -v VAR         如果指定 Shell 变量 VAR 已赋值则为真。
          -R VAR         如果指定 Shell 变量 VAR 已赋值且为名称引用则为真。
          ! EXPR         如果表达式 expr 为假则为真。
          EXPR1 -a EXPR2 如果 expr1 和 expr2 都为真则为真。
          EXPR1 -o EXPR2 如果 expr1 和 expr2 有一个为真则为真。
    
          arg1 OP arg2   算术测试。OP操作符可以是 -eq、-ne、
                         -lt、-le、-gt、或 -ge 中的一个。
    
        二元算术操作返回真,如果 ARG1 参数等于、不等于、
        小于、小于等于、大于、或者大于等于 ARG2 参数。
    
        退出状态:
        如果 EXPR 表达式估值为真则返回成功;如果 EXPR 表达式估值
        为假或者使用了无效的参数则返回失败。
    

    中括号 [

    [05:20:45 root@C8-3-55 ~]#help [
    [: [ 参数... ]
        估值条件表达式。
    
        是内建命令 "test" 的同义词,但是最后一个参数必须是
        字符 `]',以匹配起始的 `['。
    

    用来对比表达式

    [05:22:27 root@C8-3-55 ~]#x=10 ;y=20 ;test $x = $y ;echo $?
    1
    [05:22:41 root@C8-3-55 ~]#x=20 ;y=20 ;test $x = $y ;echo $?
    0
    [05:22:49 root@C8-3-55 ~]#x=20 ;y=20 ;[ $x = $y ];echo $?
    0
    

    判断变量是否为空

    [05:28:32 root@C8-3-55 ~]#A=10;echo $A;[ -z "$A" ];echo $?
    10
    1
    [05:28:45 root@C8-3-55 ~]#A=10;echo $A;unset A;[ -z "$A" ];echo $?
    10
    0
    

    实例

    • 磁盘空间超80%报警
      1 #!/bin/bash
      2 WL=75
      3 USED=`df | grep '^/dev/sd' | grep -Eo '[0-9]+%' | tr -d % | sort -nr | head -1`
      4 [ $USED -ge $WL ] && echo Disk is "$WL"% used! | mail -s "Disk Warning" 123456@789.com
    
    • 检查IP是否畅通
    
    [05:55:49 root@C8-3-55 ~]#vim cheak_IP.sh
    [05:56:25 root@C8-3-55 ~]#cat cheak_IP.sh
    #!/bin/bash
    IP=$1
    ping -c5 -w5 $IP &> /dev/null && echo $IP is UP || echo $IP is DOWN | mail -s "host $IP is down !" 12345@678.com
    [05:56:32 root@C8-3-55 ~]#bash cheak_IP.sh 10.0.0.55
    10.0.0.55 is UP
    
    • 生成10.0.0.1/24
    echo 10.0.0.{1..254} | tr -s ' ' '
    ' > IP.log;cat IP.log
    

    变量测试

    • -v 变量是否被定义
    • -R 变量是否被引用

    [[双中括号

    支持通配符和正则表达式

    [06:20:01 root@C8-3-55 ~]#help [[
    [[ ... ]]: [[ 表达式 ]]
        执行条件命令。
    
        根据条件表达式 EXPRESSION 的估值返回状态0或1。表达式按照
        `test' 内建的相同条件组成,或者可以有下列操作符连接而成:
    
          ( EXPRESSION )    返回 EXPRESSION 表达式的值
          ! EXPRESSION              如果 EXPRESSION表达式为假则为真,否则为假
          EXPR1 && EXPR2    如果 EXPR1 和 EXPR2 表达式均为真则为真,否则为假
          EXPR1 || EXPR2    如果 EXPR1 和 EXPR2 表达式中有一个为真则为真,否则为假
    
        当使用 `==' 和 `!=' 操作符时,操作符右边的字符串被用作模式并且执行一个
        匹配。当使用 `=~' 操作符时,操作符右边的字符串被当作正则表达式来进行
        匹配。
    
        操作符 && 和 || 将不对 EXPR2 表达式进行估值,如果 EXPR1 表达式足够确定
        整个表达式的值。
    
        退出状态:
        根据 EXPRESSION 的值为0或1。
    
    * * * 胖并快乐着的死肥宅 * * *
  • 相关阅读:
    面向对象(静态)
    面向对象 三大特性
    MySQL数据库表分区功能详解
    zabbix 库表介绍
    数据库分库分表思路
    Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
    zabbix 监控 tomcat
    zabbix 监控项报"Value "(No info could be read for "-p": geteuid()=1002 but you should be root"
    Linux中Swap与Memory内存简单介绍
    mysql常用命令杂记
  • 原文地址:https://www.cnblogs.com/bpzblog/p/14540313.html
Copyright © 2011-2022 走看看