• shell(7):四则运算


     shell 四则运算:expr,let,bc,(()),

    1、expr的用法:

    expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

    详细使用方式:expr --help

    expr 表达式

    表达式说明:

    • 用空格隔开每个项;
    • 用 / (反斜杠) 放在 shell 特定的字符前面;
    • 对包含空格和其他特殊字符的字符串要用引号括起来

    使用实例:

    1、计算字串长度

    > expr length "this is a test"
     14

    2、抓取字串

    > expr substr "this is a test" 3 5
    is is

    3、抓取第一个字符数字串出现的位置

    > expr index "sarasara"  a
     2

    4、整数运算

     > expr 14 % 9
     5
     > expr 10 + 10
     20
     > expr 1000 + 900
     1900
     > expr 30 / 3 / 2
     5
     > expr 30 * 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
     90
     > expr 30 * 3
     expr: Syntax error

    2、let的用法:

    let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

    语法格式

    let arg [arg ...]

    参数说明:

    arg:要执行的表达式

    实例:

    自加操作:let no++

    自减操作:let no--

    简写形式 let no+=10,let no-=20,分别等同于 let no=no+10,let no=no-20

    以下实例计算 a 和 b 两个表达式,并输出结果:

    #!/bin/bash
    let a=5+4
    let b=9-3 
    let c=7/4
    let d=4*6
    let e=1+4*6+3*2+2
    let f=1+4*6+3*2+2+8/5
    echo $a $b $c $d $e $f

    以上实例执行结果为:

    9 6 1 24 33 34

    有些用法区别去expr:

    let 不需要空格隔开表达式的各个字符。而 expr 后面的字符需要空格隔开各个字符。

    # expr 实例
    $ s=`expr 2 + 3`
    $ echo $s
    5
    
    # let 实例
    $ let s=(2+3)*4
    $ echo $s

    3、(()) 的用法:

    echo $((运算表达式))

    echo $((1+4*6+3*2+2+8/7))

    34

    4、bc的用法

    bc 命令是任意精度计算器语言,通常在linux下当计算器用。

    它类似基本的计算器, 使用这个计算器可以做基本的数学运算。

    常用的运算:

    • + 加法
    • - 减法
    • * 乘法
    • / 除法
    • ^ 指数
    • % 余数

    语法

    bc(选项)(参数)

    选项值

    • -i:强制进入交互式模式;
    • -l:定义使用的标准数学库
    • ; -w:对POSIX bc的扩展给出警告信息;
    • -q:不打印正常的GNU bc环境信息;
    • -v:显示指令版本信息;
    • -h:显示指令的帮助信息。

    参数

    文件:指定包含计算任务的文件。

    实例

    $ bc
    bc 1.06.95
    Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'.
    2+3
    5
    5-2
    3
    2+3*1
    5

    输入 quit 退出。

    通过管道符

    $ echo "15+5" | bc
    20

    scale=2 设小数位,2 代表保留两位:

    $ echo 'scale=2; (2.777 - 1.4744)/1' | bc
    1.30

    bc 除了 scale 来设定小数位之外,还有 ibase 和 obase 来其它进制的运算:

    $ echo "ibase=2;111" |bc
    7

    进制转换

    #!/bin/bash
    
    abc=192 
    echo "obase=2;$abc" | bc
    <pre>
    <p>
    执行结果为:11000000,这是用bc将十进制转换成二进制。</p>
    
    <pre>
    #!/bin/bash 
    
    abc=11000000 
    echo "obase=10;ibase=2;$abc" | bc

    执行结果为:192,这是用bc将二进制转换为十进制。

    计算平方和平方根:

    $ echo "10^10" | bc 
    10000000000
    $ echo "sqrt(100)" | bc
    10

    5、shell 浮点数除法计算:

    样例:

    num1=2
    num2=3
    num3=`expr $num1 / $num2`
    这个时候num3=0 ,是因为是因为expr不支持浮点除法
    解决的方法:
    num3=`echo "scale=2; $num1/$num2" | bc`
    带小数点显示:

    echo $(printf "%.2f" `echo "scale=2;1/3"|bc`)

    使用bc工具,scale控制小数点后保留几位
    还有一种方法,使用awk进行计算:
    awk 'BEGIN{printf "%.2f ",’$num1‘/’$num2‘}'
     
    如果用百分比表示:
    awk 'BEGIN{printf "%.2f% ",(’$num1‘/’$num2‘)*100}'
    网上找的awk和bc效率对比的截图:
     
  • 相关阅读:
    How to join (ap invoice distributions all) AP table info with PO Table
    Order Management APIs Oe_Order_Pub
    R12 Oe_Order_Pub API
    物料搬运单
    Process Order API In Order Management(详细)
    ap_invoice_distributions_all与PO表关联问题
    分配用人单位
    oe_order_pub 更改订单行数量,提示此更改的原因未提供或无效
    Order Management APIs
    提前期
  • 原文地址:https://www.cnblogs.com/lovychen/p/7760866.html
Copyright © 2020-2023  润新知