• [ Shell入门教程 ] Shell条件表达式


      Shell编程中经常需要判断文件状态、字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作。本文主要讲述文件状态、字符串、数值大小的判断比较方法。

    文件状态判断

      文件状态的判断通常使用test命令完成,test命令有2种基本格式:test condition / [ condition ]。后者使用时,需注意在条件两边加上空格,此种格式最为常用。

      判断文件状态的表达式有很多,常用表达式如下:

    -e  判断文件或目录存是否存在    
    -f  判断是否为文件
    -d  判断是否为目录    
    -r  判断文件是否有可读权限
    -w  判断文件是否有可写权限    
    -x  判断文件是否有可执行权限    
    -s  判断文件存在并且大小大于0

     下面来看下判断文件是否存在的例子。代码如下:

    #!/bin/bash
    
    filename="/etc/passwd"
    
    if [ -e "${filename}" ];then
      echo "${filename} exist"
    else
       echo "${filename} not exist"
    fi

    字符串比较

     字符串比较是条件判断中很重要的一部分,字符串比较常用格式为:[ Str1 operator Str2 ],常用的字符串比较操作符格式如下:

    Str1 == Str2 判断Str1是否等于Str2
    Str1 != Str2 判断Str1是否不等于Str2
    -z Str 判断Str是否为空
    -n Str 判断Str是否不为空

     下面我们来看下个获取键盘输入并判断输入字符串是否为Yes的例子,代码如下:

    #!/bin/bash
    read -p "Please input Yes or No:" YN #获取键盘输入并保存到变量YN
    if [ "${YN}" == "Yes" ];then
      echo "Continue"
    else
        echo "Abort"
    fi

    数字大小比较

     数值比较格式为:[ number1 operator number2 ],常用的数值比较操作符如下:

    num1 -eq num2 判断num1与num2是否相等。
    num1 -ne num2 判断num1与num2是否不相等。
    num1 -gt num2 判断num1是否大于num2
    num1 -lt num2 判断num1是否小于num2
    num1 -le num2 判断num1是否小于等于num2
    num1 -ge num2 判断num1是否大于等于num2

      为了记忆这些数字操作字符,可以这么理解-eq(equal)、-ne(not equal)-gt(greater than)、-lt(less than)、-le(less or equal)、-ge(greater or equal)。下面看下数字大小比较的基本实例,如下

    #!/bin/bash
    
    input_str=1
    if [ ${input_str} -eq 1 ];then
      echo "input number equal to 1"
    else
        echo "input number not equal to 1"
    fi

    布尔运算符

     布尔运算符主要有3种形式:! 非关系,表示对条件结果取反、-a 与关系、-o 或关系。通过利用布尔运算符,可以增加条件判断关系。

     (1)! 非关系,对条件结果取反。使用格式为:[ ! 条件表达式 ]。假设需求为判断目录不存在的情况下,创建目录,代码如下:

    #!/bin/bash
    
    DIR="/home/oracle"
    if [ ! -d "${DIR}" ];then 
      mkdir -p "${DIR}"
    fi

      (2)-a 与关系,只有第1个条件表达式为真,才会执行第2个条件表达式。表达式全部为真,结果为真。使用格式为:[ 条件表达式1 -a 条件表达式2 ]。

    input_str="Yes"
    if [ -n "${input_str}" -a "${input_str}" == "Yes" ];then
      echo "Check Success,Continue"
    else
      echo "Check Fail,abort"
    fi

     (3)-o 或关系,只要有一个表达式为真,则为真。第1个表达式为假,同样会执行第二个表达式。使用格式为:[ 条件表达式1 -o 条件表达式2 ]。

    input_str="YES"
    if [ ${input_str} == "yes" -o "${input_str}" == "YES" ];then
      echo "Check Success,Continue"
    else
      echo "Check Fail,abort"
    fi

    逻辑判断符

     逻辑判断符有2种:&& 与关系、|| 或关系。

     (1)&& 与关系。表达式全部为真,结果为真。使用格式为:[[ 条件表达式1 && 条件表达式2 ]] 或者 [ 条件表达式1 ] && [ 条件表达式2 ]

    #!/bin/bash
    
    input_str="Yes"
    if [ -n "${input_str}" -a "${input_str}" == "Yes" ];then
      echo "Check Success,Continue"
    else
        echo "Check Fail,abort"
    fi

     (2)|| 或关系。有一个表达式为真,则结果为真。使用格式为:[[ 条件表达式1 || 条件表达式2 ]] 或者 [ 条件表达式1 ] || [ 条件表达式2 ]

    #!/bin/bash
    
    input_str="YES"
    if [[ ${input_str} == "yes" || "${input_str}" == "YES" ]];then
      echo "Check Success,Continue"
    else
      echo "Check Fail,abort"
    fi

      也可以写成如下格式:

    #!/bin/bash
    
    input_str="YES"
    if [ ${input_str} == "yes" ] || [ "${input_str}" == "YES" ];then
      echo "Check Success,Continue"
    else
      echo "Check Fail,abort"
    fi

    (3)&&与||的典型用法。

    #!/bin/bash
    
    input_str="yes"
    [ "${input_str}" == "yes" -o "${input_str}" == "YES" ] && echo "Check Success,Continue" || echo "Check Fail,abort"

     expr用法

      expr命令不仅可以用于整数值的计算,也可以用于判断变量是否为数字。

    $ var=12
    $ expr ${var} + 1 >/dev/null 2>&1
    $ echo $?  <-- 如果变量全为数字,返回0
    0
    $ var="abc"
    $ expr ${var} + 1 >/dev/null 2>&1
    $ echo $? <-- 如果变量不全为数字,返回非0
    2

     在shell编程使用expr判断变量是否为全部数字时,可以采用如下形式

    #!/bin/bash
    
    var=12
    if expr ${var} + 1 > /dev/null 2>&1;then
      echo "${var} is numeric"
    else
        echo "${var} not numeric"
    fi

     

  • 相关阅读:
    CSS改变插入光标颜色caret-color简介及其它变色方法(转)
    Javascript常见性能优化
    安装和使用Karma-Jasmine进行自动化测试
    宝塔 ftp 不能连接 列出时出错
    windows 开机总动运行bat文件
    PHP回调函数--call_user_func_array
    php 获取数组第一个key 第一个键值对 等等
    ssi的使用 开启 配置等
    go get请求 json字符串转为结构体
    php protected 类型如何获取
  • 原文地址:https://www.cnblogs.com/linyfeng/p/9095119.html
Copyright © 2020-2023  润新知