• 【博学谷学习记录】超强总结,用心分享|Shell运算符


    expr命令

    Shell expr 是一个功能强大,并且比较复杂 的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等
    本文只涉及整数的计算

    直接输出结果: expr 算术运算符表达式
    给变量赋值: result=算术运算符表达式``

    注意表达式两边的反引号,不是单引号

    # 计算后会直接输出结果
    [root@node1 ~] expr 1 + 2
    3
    
    # 注意: 运算符表达式中每个数字与符号之间要有空格
    [root@node1 ~] expr 1+2
    1+2
    
    # 如果要赋值给变量要加 ` 反引号
    [root@node1 ~] result=`expr 1 + 2`
    [root@node1 ~] echo $result
    3
    [root@node1 ~] 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    算术运算符

    下表列出了常用的算术运算符,假定变量 a 为 1,变量 b 为 2:
    四则运算中如果使用了(), 也需要转义 \( 1 + 1 \)

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

    整数比较运算符

    下表列出了常用的比较运算符,假定变量 a 为 1,变量 b 为 2:
    注意: 整数比较运算符只支持整数,不支持小数与字符串,除非字符串的值是整数数字。
    每个命令都有返回值, 返回0代表成功, 返回1代表失败

    运算符说明举例
    -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

    字符串比较运算符

    可以比较2个变量, 变量的类型可以为数字(整数,小数)与字符串
    下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
    字符串比较可以使用 [[]][] 2种方式
    字符串比较没有 <= 可以通过 [[ "a" < "b" || "a" = "b" ]]

    运算符说明举例
    == 或 =相等。用于比较两个字符串或数字,相同则返回 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返回 true。[ -z $a ]
    返回 1。
    -n检测字符串长度是否不为 0,不为 0 返回 true。[ -n "$a" ]
    返回 0。
    $检测字符串是否不为空,不为空返回 0 ,否则返回1。[ $a ]
    返回 0。
    [root@node1 ~] a=5
    [root@node1 ~] b=7
    [root@node1 ~] 
    
    # [[和]]与表达式之间一定要有空格,不然会语法报错
    # 错误示范[[$a < $b || $a = $b]]
    if [[ "a" < "b" || "a" = "b" ]]
    > then
    >     echo "$a <= $b : a 小于等于 b" 
    > else
    >     echo "$a > $b: a 大于 b" 
    > fi
    
    
    5 <= 7 : a 小于等于 b
    [root@node1 ~] 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    [[]][] 的区别

    区别1: word splitting的发生
    区别说明

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

    word splitting介绍

    会将含有空格字符串进行分拆分割后比较
    通过 $? 获取上一个命令的退出状态, 0代表成功, 1代表失败

    [root@node1 ~] a=a
    [root@node1 ~] b="a b c"
    
    # 比较
    [root@node1 ~] [[ $a == $b ]]
    [root@node1 ~] echo $?
    1 
    
    #单中括号拆分了变量b的a后面的2个字母当成了参数
    [root@node1 ~] [ $a == $b ]
    -bash: [: 参数太多
    [root@node1 ~]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    区别2: 转义字符
    区别说明

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

    示例

    [] 执行效果,需要转义比较才能返回正确的结果

    # 不转义比较字符串,怎么比较返回都是0,说明无效
    [root@node1 ~] [ "a" > "b" ]
    [root@node1 ~] echo $?
    0
    [root@node1 ~] [ "a" < "b" ]
    [root@node1 ~] echo $?
    0
    
    
    # 转义比较字符串小于的比较为0表示正确
    [root@node1 ~] [ "a" \> "b" ]
    [root@node1 ~] echo $?
    1
    [root@node1 ~] [ "a" \< "b" ]
    [root@node1 ~] echo $?
    0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    [[]] 执行效果, 不需要转义执行结果正确

    [root@node1 ~] [[ $a < $b ]]
    [root@node1 ~] echo $?
    0
    [root@node1 ~] [[ $a > $b ]]
    [root@node1 ~] echo $?
    1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    小结

    1. 整数比较运算符

    比较方式: [](())

    方式1: [ 整数1 options 整数2 ]
    options: -eq -gt -ge -lt -le -ne
    方式2: ((整数1 options 整数2))
    options: < <= > >=

    1. 字符串,数字比较运算符

    介绍: 可以比较2个变量, 变量的类型可以为字符串, 数字(整数,小数)
    比较方式: [][[]]

    方式1: [ 变量1 options 整数2 ]
    options: <,>,==,=,!=
    <,> 需要转义
    比较含有空格的字符串, 需要使用""号括起来, 否则会分割拆分
    方式2: [[ 变量1 options 变量2]]
    options: <,>,==,=,!=
    <,> 不需要转义

    推荐使用哪个比较运算符?
    [[ 表达式 ]] 即可以实现数字和字符串比较, 并且不需要转义, 不会分割

  • 相关阅读:
    神经网络和深度学习-后向传播back propagation
    双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响
    【Pytest接口自动化Case失败如何下线】
    Linux下调试代码——gdb的使用
    Mybatis框架源码笔记(一)之编译Mybatis源码和源码调试环境准备
    深度学习论文精读[9]:PSPNet
    KEIL5 .33 调试M33单片机经常崩溃
    六、主存储器管理,计算机操作系统教程,第四版,左万利,王英
    Scala 入门指南:从零开始的大数据开发
    月报总结|Moonbeam6月份大事一览
  • 原文地址:https://blog.csdn.net/xz842913787/article/details/126688596