• linux命令:计算的相关命令(expr、let、bc、(())、 $[])


    一、expr

    expr(evaluate expressions)命令为Linux中的命令,一般用于整数值计算,但也可用于字符串操作
    1、整数运算
    (1)注意:
      需要空格,需要加"\"不让特殊字符转义。

    符号用法
    \(反斜杠)放在 shell 特定的字符前面
    “”(引号)对包含空格和其他特殊字符的字符串要用引号括起来

    (2)语法:

    expr argument operator argument
    
    • 1

    参数说明
    argument:为第一个参数
    operator:为操作运算符
    argument:为第二个参数

    (3)运用实例

    $expr 10 + 10
    20
    $expr 1500 + 900
    2400
    $expr 30 / 3
    10
    $expr 30 / 3 / 2
    5
    $expr 30 \* 3
    90
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义。

    2、字符串操作
    (1)计算字符串的长度语法
    1)语法

    expr length ”字符串“
    
    • 1

    2)应用实例

    expr length "xxxxx"
    5
    
    • 1
    • 2

    (2)截取字符串语法
    1)语法

    expr substr ”字符串“ startNode endNode
    
    • 1
    参数含义
    startNode截取字符串的起始位置,从1开始(注意编号从1开始,而不是0开始)
    endNode截取字符串的结束位置,包含这个位置也被截取

    2)应用实例

    expr length "abcdefg" 13
    abc
    
    • 1
    • 2

    (3)获取一个字符在字符串中第一次出现的位置
    1)语法

    expr index 被查找的字符串  需要查找的字符
    
    • 1

    2)应用实例

    expr length "abcdefg" c
    3
    
    • 1
    • 2

    (4)正则表达式匹配1语法
    1)语法

    expr match 字符串 正则表达式
    
    • 1

    a.正则表达式默认带有“^”,表示已什么开头
    b.返回值为符合,匹配字符长度,否则返回0
    c.正则表达式“."(点)代表任意一个字符
    d.正则表达式中通配符“*”(星号)代表前面的字符可以出现0次到多次
    e.“.*m”(点心m):匹配字符串中m前面的字符串长度(以任意长度字符开头到m结束且包含m,匹配m之前的长度。得出匹配字符串的长度)

    2)应用实例

    expr match "abcdefgm" ".*m"
    8
    expr match "abcdefgm" ".*g"
    7
    expr match "abcdefgm" ".*x"
    0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (5)正则表达式匹配2语法,功能和1一样,语法比1简单
    1)语法

    expr 字符串 :正则表达式
    
    • 1

    a.正则表达式默认带有“^”,表示已什么开头
    b.返回值为符合,匹配字符长度,否则返回0

    2)应用实例

    expr match "abcdefgm" : ".*m"
    8
    
    • 1
    • 2

    二、let

    1、功能
      let命令进行整数数学运算赋值。
    注意:
      let命令和双小括号(()),在数学计算方面功能一样,但是没有(())的功能强大,let只能用于赋值计算,不能直接输出,不可以和if条件判断一起使用

    2、语法

    let 赋值表达式
    
    • 1

    (1)语法功能等价于((表达式)),let后面的整数运算表达式中变量不需要加$,特殊字符前也不需要加“\”。
    (2)多个表达式之间使用空格,而不是","号
    (3)对于类似let a+b这样的写法,Shell虽然计算了a+b的值,但却将结果丢弃,如果echo let a+b会直接输出字符串a+b;若不想这样,可以使用let sum=a+b将a+b的结果保存在变量sum中

    3、运用实例
    (1)正常整数运算

    a=1 b=2
    let c=a+b
    echo $c
    3
    
    • 1
    • 2
    • 3
    • 4

    (2)变量++和++变量的区别

    a=2
    let b=a++
    echo $a $b
    3 2
    c=2
    let d=++c
    echo $c $d
    3 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (3)变量数值自增+2的表示方法

    a=4
    let a+=2
    echo $a
    6
    
    • 1
    • 2
    • 3
    • 4

    (4)乘法表示方法

    b=2
    let b*=6;echo $b
    12
    
    • 1
    • 2
    • 3

    4、总结
      (1)let数字整数计算用法
      (2)作用:用于赋值,是最简洁的整数运算赋值命令计算赋值用法: let变量名=整数运算表达式
      (3)多个表达式计算赋值用法: let 变量名1=整数运算表达式1 变量名2=整数运算表达式2 …

    三、bc

    1、功能
      完成整数及小数运算
    (1)能够在bc中进行互动式的数学运算
    (2)能够在shell中进行非互动式的bc管道运算
    (3)能够在shell中非互动式的输入重定向bc运算

    2、bc中的互动式的数学运算
    (1)语法(作为系统计算器使用)

    bc [选项] [参数]
    
    • 1

    对文件内容进行计算

    cat x.txt
    100+22+34
    140+22+34
    # 文件内编辑运算内容
    bc -q x.txt
    156
    196
    # 直接得出每行结果
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (2)内置变量
      scale :指定精度,对计算结果指定保留小数;默认为0,即不使用小数部分只保留整数位。

    3、bc在shell中进行非互动式的bc管道运算
    (1)语法

    echo "表达式" | bc [选项]
    
    • 1

    (2)将bc计算的结果赋值给shell变量
    第一种方式:

    A=$(echo "表达式" | bc [选项]
    • 1

    第二种方式:反引号

    A=echo "表达式" | bc [选项] 
    
    • 1

    两种方式区别
      ``反引号是所有linux系统支持的方式。兼容性较好,但是容易与引号产生混淆
      $()不是所有linux系统都支持的方式。兼容性较差,但是不容易产生混淆
      
    4、bc在shell中进行非互动式的输入重定向运算
    (1)作用
    将计算表达式输出给bc去执行,特点类似于文件中输入,可以输入多行表达式,更加清晰。
    (2)语法
    第一种方式:

    A=`bc << EOF
    第一行表达式
    第二行表达式
    第三行表达式
    ......................
    EOF
    ` (反引号结束)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第二种方式:

    A=$(bc << EOF
    第一行表达式
    第二行表达式
    第三行表达式
    ......................
    EOF
    ) 括号结束
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    四、(())

    1、作用
      (())在运算表达式书写时,彼此之间有无空格都可以,遇到特殊字符时也不需要加“\”能够使用(())进行整数的数学运算。

    2、解析
      双小括号(()),用于进行数学运算表达式的执行,将数学运算表达式放在((和))之间。可以使用$获取(())表达式命令的结果,这和使用$获得变量值是一样的

    3、语法

    ((整数运算表达式))
    
    • 1

    4、用法
    (1)给与双括号里面的变量赋值
    ((a=1+6)):可以在计算完成后给变量赋值。
    ((b=a-1)) :把a-1的计算结果赋值给b,此中的变量a前面不需要加$,(())具有自动解析双括号内的变量的功能。

    (2)给与双括号外面的变量赋值

    a=$((1+6))   
    b=$((a-1))
    c=$((a+b))
    
    • 1
    • 2
    • 3

    解析:
      可以在(())前面加上S符号获取(())命令的执行结果,从而获取整个表达式的值。以c=$((a+b))为例,即将a+b这个表达式的运算结果赋值给变量c。注意,如果c=((a+b)这样的写法是错误的,不加$就不能取得表达式的结果。

    (3)于逻辑预算符进行使用
      ((a>7 && b==c)):(())也可以进行逻辑运算,在if语句中常会使用逻辑运算。
      echo $((a+10)):需要立即输出表达式的运算结果时,可以在(())前面加$符号
      ((a=3+5,b=a+10)):对多个表达式同时进行计算时,多表表达式使用"∵"号隔开

    # 计算1+6并赋值给变量a
    ((a=1+6))
    # 计算变量a-1赋值给变量b
    ((b=a-1))
    # 计算变量a+变量b赋值给变量c
    ((a+b))
    # 打印变量a,变量b,变量c的值
    echo "a=${a},b=${b},c=${c}"
    # $赋值写法
    a=$((1+6)) b=$((b=a-1)) c=$((a+b))
    # (())多个表达式计算赋值
    ((a=1+6,b=a-1,c=a+b))
    # echo输出直接使用(())
    echo "1+6=$((1+6))"
    # (())用于逻辑表达式在if中使用
    if ((a>7 && b==c))
    	then
    		echo "a>7 && b==c成立"
    	else
    		echo "a>7 && b==c 不成立"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    (4)总结
    1)括号内赋值:((变量名=整数表达式))
    2)括号外赋值:变量名=$((整数表达式))
    3)多表达式赋值:((变量名1=整数表达式1,变量名2=整数表达式2...))
    4)与if条件句配合使用:if((整数表达式))

    五、$[]

    1、功能
      能够使用$[ ]进行整数的数学运算。
      和(())、let命令类似,$[ ]也只能进行整数运算。但是只能对单个表达式的计算求值与输出,不能多个同属进行。

    2、语法

    $[表达式]
    
    • 1

    (1)$[ ]会对表达式进行计算,并取得计算结果
    (2)表达式内部不可以赋值给变量没有(())功能强大

    3、应用实例

    a=$[a=2+9]
    echo $a
    1
    # 括号不需要空格和对特殊字符的处理
    b=$[c=2*a]
    echo $b
    22
    # c=2xa
    d=$[a**2]
    echo $d
    121
    # d=a的2次方
    a=$[a**3]
    echo $e
    1331
    # d=a的3次方
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    六、总结

    1、let赋值最方便 。
    2、(())直接求值输出最方便,且支持多表达式同时运算。
    3、expr
      优点:可以直接输出。
      缺点:计算表达式里面引用变量使用$,特殊字符需要转义只能计算一个表达式。
    4、(())
      优点:直接输出,里面直接使用变量名,特殊字符不需要转义,多个表达式赋值,可进行多表达式同时i计算,使用”,“互相分开。
      缺点:需要获值以后才可以输出。
    5、let
      优点:赋值简单,特殊字符不需要转义,可进行多表达式同时i计算,使用空格互相分开。
      缺点:不能直接输出。

    6、$[ ]
      优点:特殊字符不需要转义。
      缺点:不能进行多表达式同时计算。
    7、bc可以计算整数和小数,在保留小数后几位,只有除法有效。

    参考自:
    https://blog.csdn.net/m0_62948770/article/details/126083511

  • 相关阅读:
    鸿蒙Harmony应用开发—ArkTS声明式开发(触摸事件)
    Python利用PIL将png图像转jpg图像
    [递归,步数最少] 骑士游历
    基于java+swing+mysql北方传统民居信息管理系统
    Django 用相对路径方式引用自定义模块 或 文件
    pat 1145
    Android 10.0 关于在系统Launcher3中调用截图api总是返回null的解决方案
    数说故事×IDEA荣获语言与智能技术竞赛「视频语义理解赛题」季军
    卫龙辣条第三次冲刺上市:业绩增速下滑,刘卫平、刘福平提前套现
    Web3 游戏发展趋势的 5 个预测
  • 原文地址:https://blog.csdn.net/qq_16268979/article/details/127913225