zoukankan      html  css  js  c++  java
  • shell的算术运算

     

     

    变量的数值计算方法大致有双括号 (()), expr,  bc, $[ ]   

     

     

    例子1

     

    注意:2**3表示2的3次方,a++表示先输出a自身的值,然后进行++的运算; --a表示先进行--的运算,然后再输出a自身的值 

    这例子的意思就是说啊
    1. 双括号里可以直接运算并且赋值给变量,简单的运算就用 ((a=1+2**4-4%2))吧,方便啊
    2. 也可以是双括号里运算完后,按照平常的方式赋值给变量,就是例子中的b=$((....)),运算复杂了用这一种,比如括号里有变量的时候。
    3. 都不用赋值给变量,直接出运算结果。这种方法有时候会有奇效,比如下面的实现加减乘除计算器
     
     
    例子2:比较大小,真的布尔值为1,假的布尔值为0

     

    例子3:计算连续数之和的公式  n*(n+1)/2

    注意: 

    上面的所有操作只能是用整数,小数是不能成功运算的

     

    例子3:关于双括号中空格的问题

     

    例4,变量运算,(())中直接写变量名

    #!/bin/bash
    read num1 num2 num3
    while [ $num1 -lt $num3 ]
    do
        echo $num1
        num1=$((num1+num2))
    done

     

    二. bc命令的用法,可以用于小数

    可直接输入bc命令进入交互界面,进行操作;当然也可以在命令行中进行操作,因为bc支持科学计算,所有功能很强大,只要是正确的计算表达式,bc就能处理。

    scale可以用来设置保留小数点的位置,scale=3就表示保留三位小数;  

    obase可以把十进制数转变为其他进制的值。 

     

    例子1:

    echo 3.5+5 | bc  输出为8.5

    echo "obase=2;8" | bc  输出为1000    #表示为10进制的8转换成2进制的值

    echo "obase=16;20" | bc    #表示十进制20转成16进制的值

    echo "scale=3; 5.23/3.13" | bc     #保留三位小数值

     

    例子2

    seq -s "+" 10     #输出为1+2+3+4+5+6+7+8+9+10

    seq -s "+" 10 | bc    #输出为55

    说明:seq -s "+”10,它表示以“+”为分隔符,来按顺序生成1-10;

     

    有关变量的小数计算还是用awk好,比如

    x=3.4

    y=4.6

    echo $x $y |awk '{print $1+$2}

     

    三. expr (evaluate expressions)

    expr 命令一般用于整数值,但也可以用于字符串,用来求表达式的值,同时expr也是一个手工命令行计算器

    1. expr基本算数运算

    expr $[$a+$b],使用中括号的形式进行运算的方式值得推荐

    例如:expr $[2+3]   输出为5

    注意:其实这里expr就是一个输出的功能,数值的计算已经由 $[...] 完成,所以等价于echo $[2+3]也可以直接输出计算结果

     

    2. expr 匹配字符用法,expr "..." : "..."

    例如,expr "test.txt" : ".*.txt"    输出为非0

    如果结果非0,判断为真,说明字符匹配;如果输出为0,表示不匹配

    脚本中可以做一个小优化

    expr "text.pub" : ".*.pub" && echo 1 || echo 0

     

    3. 用expr判断变量是否整数

    expr $a + 0 > /dev/null 2>&1

    [ $? -eq 0 ] && echo int || echo chars

    如果想连续判断,可以把上面语句放在while true 循环中

     

    4. 通过expr计算字符串长度

    chars=`seq -s " " 100`  

    echo ${#chars}    或者  echo $(expr length "$chars")  都可以得到字符串长度

    注意:两种把命令执行结果赋值给变量的方式为  `....` 和 $(....)

    拓展expr的用法

    # seq 1 10,输出是1 2 3 4 5 6 7 8 9 10

    默认分隔符是空格,可以用-s 指定分隔符,如下

    test3=`seq -s "+" 1 10`;echo $test3     输出为1+2+3+4+5+6+7+8+9+10

    expr $[$test3]可计算其值,结果为55

     

     

     

    四. read命令及其实践

    shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入中获得

    格式为:read [参数] [变量名]

    常用参数:

    -p:设置提示信息

    -t:设置输入超时,默认单位为秒

     

    例子2,有如下脚本,可执行参数值不为整数的情况

    #!/bin/bash

    while true

    do

        read -t 10 -p "please input 2 number:" a b

        expr $a + 0 > /dev/null 2>&1

        [ $? -ne 0 ] && continue  #continue表示不执行下面的代码,转而进入下一轮循环

        expr $b + 0 > /dev/null 2>&1

        [ $? -ne 0 ] && continue||break   #break表示立马跳出所有循环

    done

     

     

     

     

  • 相关阅读:
    AC自动机
    【洛谷P1972】HH的项链
    【洛谷P4341】外星联络
    【洛谷P4576】棋盘游戏
    【JZOJ3800】败屩妖
    【JZOJ3798】临洮巨人
    【洛谷P3830】随机树
    【JZOJ3799】青蛙神
    牛客练习赛56 题解
    【洛谷P5300】与或和
  • 原文地址:https://www.cnblogs.com/regit/p/8058721.html
Copyright © 2011-2022 走看看