Loading

【Shell】运算符

算术运算符

  • expr(求值表达式)命令

    expr 是 evaluate expressions 的缩写,译为“求值表达式”。

  • expr语法

    • 计算语法
      expr 算术运算符表达式
      
      注意:
          运算符表达式中每个数字与符号之间要有空格
          只能进行整数的运算,不能进行小数的运算
      
    • 获取计算结果赋值给新变量语法
      result=`expr 算术运算符表达式` #反引号 反引号可以执行里面的命令
      
      image
  • 算术运算符介绍

    下表列出了常用的算术运算符,假定变量 a 为 1,变量 b 为 2:

    运算符说明举例
    +加法expr $a + $b 结果为 3
    -减法expr $a - $b 结果为 -1
    *乘法expr $a \* $b 结果为 2
    /除法expr $b / $a 结果为 2
    %取余expr $b % $a 结果为 0
    =赋值a=$b 将把变量 b 的值赋给 a

    四则运算中如果使用了(), 也需要转义 \( 1 + 1 \),首个\(和数字之间需要有空格

    #!/bin/bash
    # 使用read命令读取输入两个数字
    read -p "请输入第一个数字:"
    read -p "请输入第二个数字:"
    
    # 对两个数字进行算数运算
    echo "a=${a} b=${b}"
    echo "a + b = `expr $a + $b`"
    echo "a * b = `expr $a \* $b`"
    echo "a - b = `expr $a - $b`"
    echo "a * b = `expr $a \* $b`"
    echo "b / a = `expr $b / $a`"
    echo "b % a = `expr $b % $a`"
    echo "b * (a + a) = `expr $b \* \( $a + $a \)`"
    

    image

比较运算符

  • 整数比较运算符[] 和 (())

    • 执行方式一:单词方式[ ],执行过成功中,字符与字符之间,符号与符号之间是有空格的
    • 执行方式二:符号(( )),不需要有空格

    下表列出了常用的比较运算符,假定变量 a 为 1,变量 b 为 2:

    运算符说明举例
    -eqequals 检测两个数是否相等,相等返回 0, 否则返回1。[ $a -eq $b ] 返回 1。
    -nenot equals检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 0。
    -gtgreater than检测左边的数是否大于右边的,
    是返回0, 否则1
    [ $a -gt $b ] 返回 1。
    -ltlower than检测左边的数是否小于右边的,
    是返回0, 否则1
    [ $a -lt $b ] 返回 0。
    -gegreater equals检测左边的数是否大于等于右边的,
    是返回0, 否则1
    [ $a -ge $b ] 返回 1。
    -lelower equals检测左边的数是否小于等于右边的,
    是返回0, 否则1
    [ $a -le $b ] 返回 0。
    <检测左边的数是否小于右边的,
    是返回0, 否则1
    (($a<$b)) 返回0
    <=检测左边的数是否小于等于右边的,
    是返回0, 否则1
    (($a<=$b)) 返回0
    >检测左边的数是否大于右边的,
    是返回0, 否则1
    (($a>$b)) 返回1
    >=检测左边的数是否大于等于右边的,
    是返回0, 否则1
    (($a>=$b)) 返回1
    ==检测左边的数是否等于右边的,
    是返回0, 否则1
    (($a==$b)) 返回1
    !=检测左边的数是否不等于右边的,
    是返回0, 否则1
    (($a!=$b)) 返回0

    注意:

    • 整数比较运算符只支持整数不支持小数与字符串(字符串比较后续讲解),除非字符串的值是整数数字。
    • 每个命令都有返回值, 这个后面我们会讲解退出状态再具体说明,返回0代表成功, 返回1代表失败
  • 演示

    #!/bin/bash
    a=1 b=2
    echo "a=${a} b=${b}"
    if [ $a -eq $b ]
    then
    echo "$a -eq $b : a 等于 b"
    else
    echo "$a -eq $b: a 不等于 b"  # 输出这个
    fi
    if [ $a -ne $b ]
    then
    echo "$a -ne $b: a 不等于 b"  # 输出这个
    else
    echo "$a -ne $b : a 等于 b"
    fi
    if [ $a -gt $b ]
    then
    echo "$a -gt $b: a 大于 b"
    else
    echo "$a -gt $b: a 不大于 b"  # 输出这个
    fi
    if [ $a -lt $b ]
    then
    echo "$a -lt $b: a 小于 b"   # 输出这个
    else
    echo "$a -lt $b: a 不小于 b"
    fi
    if [ $a -ge $b ]
    then
    echo "$a -ge $b: a 大于或等于 b"
    else
    echo "$a -ge $b: a 小于 b"  # 输出这个
    fi
    if [ $a -le $b ]
    then
    echo "$a -le $b: a 小于或等于 b"  # 输出这个
    else
    echo "$a -le $b: a 大于 b"
    fi
    
    if (($a > $b))
    then
    echo "$a > $b: a 大于 b"
    else
    echo "$a > $b: a 不大于 b"
    fi
    if (($a < $b))
    then
    echo "$a < $b: a 小于 b"
    else
    echo "$a < $b: a 不小于 b"
    fi
    if (($a >= $b))
    then
    echo "$a >= $b: a 大于或等于 b"
    else
    echo "$a >= $b: a 小于 b"
    fi
    if (($a <= $b))
    then
    echo "$a <= $b: a 小于或等于 b"
    else
    echo "$a <= $b: a 大于 b"
    fi
    

    image

  • 字符串比较运算符[] 和 [[]]

    可以比较2个变量, 变量的类型可以为数字(整数,小数)与字符串

    • 语法:

      假定变量 a 为 “abc”,变量 b 为 “efg”:

      运算符说明举例
      == 或 =相等。用于比较两个字符串或数字,相同则返回 0。可以使用=[ $a == $b ] 返回1
      [ $a = $b ] 返回 1
      [[ $a == $b ]] 返回1
      [[ $a = $b ]] 返回1
      !=不相等。用于比较两个字符串或数字,不相同则返回 0。[ $a != $b ] 返回 0
      [[ $a != $b ]] 返回 0
      <小于, 用于比较两个字符串或数字, 小于返回0, 否则返回1[ $a \< $b ] 返回 0
      [[ $a < $b ]] 返回 0
      >大于, 用于比较两个字符串或数字, 大于返回0, 否则返回1[ $a \> $b ] 返回 1
      [[ $a > $b ]] 返回 1
      -z检测字符串长度是否为0,如果长度为0返回则返回0, 否则返回1。[ -z $a ] 返回 false。
      -n检测字符串长度是否不为 0,如果长度不为 0 则返回0, 否则返回1。[ -n “$a” ] 返回 true。
      $检测字符串是否为空,为空返回0,不为空返回1[ $a ] 返回 true。
      • 字符串比较可以使用[[ ]]和[ ] 2种方式
        • [] 大于号、小于号需要使用\转义,[[]]不需要转义
      • 字符串比较没有 <= 可以通过 [[ "a" < "b" && "a" == "b" ]]
  • 演示:

    #!/bin/bash
    
    a="itheima" b="itcast" c=1 d=2
    echo "a=${a},b=${b},c=${c},d=${d}"
    
    if [ $a = $b ]
    then
    echo "$a = $b : a 等于 b"
    else
    echo "$a = $b: a 不等于 b"
    fi
    
    if [ $a != $b ]
    then
    echo "$a != $b : a 不等于 b"
    else
    echo "$a != $b: a 等于 b"
    fi
    
    if [[ $a > $b ]]
    then
    echo "$a > $b : a 大于 b"
    else
    echo "$a > $b: a 不大于 b"
    fi
    
    if [ $a \> $b ]
    then
    echo "$a > $b : a 大于 b"
    else
    echo "$a > $b: a 不大于 b"
    fi
    
    if [[ $c > $d ]]
    then
    echo "$c > $d : c 大于 d"
    else
    echo "$c > $d: c 不大于 d"
    fi
    
    if [ -z $a ]
    then
    echo "-z $a : 字符串长度为 0"
    else
    echo "-z $a : 字符串长度不为 0"
    fi
    
    if [ -n "$a" ]
    then
    echo "-n $a : 字符串长度不为 0"
    else
    echo "-n $a : 字符串长度为 0"
    fi
    
    if [ $a ]
    then
    echo "$a : 字符串不为空"
    else
    echo "$a : 字符串为空"
    fi
    

    image

    • [[]] (推荐) 和 [] 的区别

      比较运算符有个三个:[[]]、[]、(())

      • 不推荐使用(()) 原因:只能比较整数、字符串比较不了、小数也比较不了(不推荐)
      • 区别2:word splitting(单词分割)的发生

        • word splitting介绍:

          • 会将含有空格字符串进行分拆分割后比较
        • 区别说明:

          • [[]] 不会有word splitting发生
          • [] 会有word splitting发生

          image

      • 区别2: 转义字符

        • 区别说明:
          • [[]] 对 < 不需要转义, 格式为 [[ 字符串1 < 字符串2 ]]
            image

          • [] 需要对 <,> 转义 , 格式为 [ 字符串1 \< 字符串2 ]
            image

布尔运算符[-a、-o、!]

布尔运算符放在[ ]或 与test 命令配合使用才有效

运算符说明举例
!非运算,取反, 表达式为 true 则返回 false,
否则返回 true。
[ ! 表达式 ] 取反。
-oor 或运算,有一个表达式为 true 则返回 true。[ 表达式1 -o 表达式2 ]
-aand 与运算,两个表达式都为 true 才返回 true。[ 表达式1 -a 表达式2 ]
#!/bin/bash
a=1 b=2

if [ $a -lt 2 -a $b -gt 10 ]
then
echo "$a 小于 2 且 $b 大于 10 : 返回 true"   
else
echo "$a 小于 2 且 $b 大于 10 : 返回 false"  # $b -gt 10不成立, 输出这个表达式
fi

if [ $a -lt 10 -o $b -gt 10 ]
then
echo "$a 小于 10 或 $b 大于 10 : 返回 true"  # $a -lt 10 成立, 输出这个表达式
else
echo "$a 小于 10 或 $b 大于 10 : 返回 false"
fi

if [ ! $a -gt $b ]
then
echo "$a 大于 $b 取反 : 返回 true"
else
echo "$a 大于 $b 取反 : 返回 false"   # $a -gt $b 为true , 取反为false, 输出这个表达式
fi

image

逻辑运算符[[&&、||、!]] ((&&、||)) [!]

运算符说明举例
&&逻辑的 AND[[ 表达式1 && 表达式2 ]]
||||
!逻辑非[[ ! 表达式 ]]

注意:

  1. 使用&& 和 || 的运算符必须放在 [[]] 或 (())中才有效, 否则报错
  2. ! 可以用在[],[[]]中, 不可以在(())
#!/bin/bash

a=1 b=2

if [[ $a -lt 10 && $b -gt 10 ]]
then
echo "返回 true" 
else
echo "返回 false"  # $b -gt 10 不成立, 输出false
fi

if [[ $a -lt 10 || $b -gt 10 ]]
then
echo "返回 true"   # $a -lt 10 成立,  输出true
else
echo "返回 false"  
fi

image

文件测试运算符

  • linux系统文件类型介绍

    • -:普通文件
    • d:目录文件
    • l:链接文件
    • b:块设备文件,比如计算机硬盘/dev/sda
    • c:字符设备文件,比如计算机的USB文件/dev/usb
    • p:管道文件
  • 属性检测

    操作符说明举例
    -b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
    -c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
    -d filedirectory, 检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
    -f filefile, 检测文件是否是普通文件(既不是目录,也不是设备文件)
    ,如果是,则返回 true。
    [ -f $file ] 返回 true。
    -g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
    -k file检测文件是否设置了粘着位(Sticky Bit),如果是,
    则返回 true。
    [ -k $file ] 返回 false。
    -p file检测文件是否是有名管道文件,如果是,则返回 true。[ -p $file ] 返回 false。
    -u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
    -r fileread,检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
    -w filewrite,检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
    -x fileexecute, 检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
    -s filesize, 检测文件是否为空(文件大小是否大于0)
    ,不为空返回 true。
    [ -s $file ] 返回 true。
    -e fileexists, 检测文件(包括目录)是否存在,如果是,
    则返回 true。
    [ -e $file ] 返回 true。
    file1 -nt file2new than(nt), file1是否比file2新[ file1 -nt file2 ]
    file1 -ot file2old than(ot), file1是否比file2旧[ file1 -ot file2 ]
  • 其他检查符:

    • -S: 判断某文件是否 socket。
    • -L: link, 检测文件是否存在并且是一个符号链接。
  • 语法:

    [ options 文件路径字符串]
    或
    [[ options 文件路径字符串 ]]
    
  • 演示:

    #!/bin/bash
    
    file="/root/operation1.sh"
    # 测试文件是否可写
    if [ -w $file ]
    then
    echo "文件可写"
    else
    echo "文件不可写"
    fi
    # 测试是否可读
    if [ -r $file ]
    then
    echo "文件可读"
    else
    echo "文件不可读"
    fi
    # 测试是否执行
    if [ -x $file ]
    then
    echo "文件可执行"
    else
    echo "文件不可执行"
    fi
    # 测试文件是什么类型的文件
    if [ -f $file ]
    then
    echo "文件是普通文件"
    else
    echo "文件是特殊文件"
    fi
    # 测试文件是否为空
    if [ -s $file ]
    then
    echo "文件不是空"
    else
    echo "文件是空"
    fi
    # 测试文件是否存在
    if [ -e $file ]
    then
    echo "文件存在"
    else
    echo "文件不存在"
    fi
    # 测试文件是否是目录
    if [ -d $file ]
    then
    echo "文件是目录"
    else
    echo "文件不是目录"
    fi
    
    # 判断文件的新旧
    file2="/root/operation2.sh"
    if [ file -nt file2 ]
    then
    echo "operation1.sh文件比operation2.sh文件新"
    else
    echo "operation1.sh文件不比operation2.sh文件新"
    fi
    

    image

    image

posted @ 2023-02-12 23:09  爱learn  阅读(60)  评论(0编辑  收藏  举报