04.Shell数值运算及处理

一、整数运算操作

基本运算类别
a.四则运算
    加法:num1+num2
    减法:num1-num2
    乘法:num1*num2
    整除:num1/num2
b.取余数运算
    求模:num1%num2

I. 计算工具

1.使用expr命令工具

    格式:expr 整数1 运算符 整数2 .. ..
    乘法操作应采用\*转义,避免被作为Shell通配符
    运算符和整数之间必须有空格
    整数值可以有变量提供,计算结果直接显示在屏幕上
类型运算符示例
加法+expr 43 + 21 ; expr $X + $Y
减法-expr 43 - 21 ; expr $X - $Y
乘法\*expr 43 \* 21 ; expr $X \* $Y
除法/expr 43 / 21 ; expr $X / $Y
取余数%expr 43 % 21 ; expr $X % $Y
示例:
$ X=48;Y=21
$ expr X + 12
expr: 非数值参数
$ expr $X + 100 - $Y \* 2 / 7    //混合运算,乘除优先
142
$ expr $X / $Y                  //除法,取整数
2
$ expr $X % $Y                  //除法,取余数
6
$ expr 12 * 13
expr: 语法错误

2.算式替换

使用$[]表达式或$(())表达式
格式:$[整数1 运算符 整数2 .. ..]
乘法操作无需转义,运算符两侧可以无空格,引用变量可省略$符号
计算结果替换表达式本身,结合echo命令才能显示到屏幕上
$ X=48;Y=21
$ echo $[X+100-Y*2/7]       //混合运算,乘除优先
142
$ echo $[X/Y]               //除法,取整数
2
$ echo $[X%Y]               //除法,取余数
6
$ echo $[10**3]             //$[]表达式还支持乘法运算
1000
$ echo $((X-21)),$((X*21))
27,1008

3.整数运算实例

   1)识别一个整数是奇数还是偶数
       取与2相除的余数,结果为0表示该整数为偶数,否则为奇数
   2)识别一个整数是否为7的倍数
       取与7相除的余数,结果为0表示该整数是7的倍数,否则不是
$ X=48;Y=21
$ echo $[X%2],$[Y%2]
0,1                 //X的值为偶数,Y的值为奇数
$ echo $[X%7],$[Y%7]
6,0                 //Y的值是7的倍数,X的值不是

4.整数变量的自增处理

1)自增表达式

    适用于更改单个变量的值
        先运算,将运算结果保存到这个变量
        后取值,以这个变量的新值作为整个表达式的值
运算类别对应的表达式应用示例
加法i+=2或者i=i+2echo $[i+=2]
减法i-=2或者i=i-2echo $[i-=2]
乘法i*=2或者i=i*2echo $[i*=2]
除法i/=2或者i=i/2echo $[i/=2]
求模i%=2或者i=i%2echo $[i%=2]
i+=1
    当变量自增/减的数量为1时
         数量1可以省略、+=可写成++、-=可写成
         比如,++i相当于i+=1、--i相当于i-=1
$ X=48;Y=21
$ echo $[++X],$[--Y]        //先保存运算结果,再取值
49,20
$ echo $X,$Y 
49,20

2)++i与i++的区别

a.运算符在前,++i或--i
        先运算,将运算结果保存到这个变量
        后取值,调用这个变量的新值
        $ X=48;echo $[++X],$X 
        49,49                   //先运算,后取值
b.运算符在后,i++或i--
        先取值,调用这个变量的旧值
            先取值,调用这个变量的旧值
            后运算,将运算结果保存到这个变量
        $ X=48;echo $[X++],$X 
        48,49                   //先取值,后运算

5.使用let命令操作变量

操作变量值运算,只运算,不输出结果,如有需要则保存新结果
         1)适用于不需要输出的情况,比如循环次数记录
         2)若要查看结果,可结合echo命令
$ X=48;Y=21
$ let X++,Y/3   //使X增加1,Y除以3,并存入新值
$ echo $X,$Y    //确认操作结果
49,7
$ i=42
$ let i++;echo $i
43
$ let i-=7;echo $i 
36
$ i = 12
$ expr $i + 1
13
$ echo $i
12

6.使用随机整数

1)环境变量RANDOM
在/bin/bash环境可直接使用
    	每次被调用时,随机生成0~32767之间的一个整数
    	结合echo命令可查看效果
$ echo $RANDOM 
24846
$ echo $RANDOM 
1296
$ echo $RANDOM,$RANDOM,$RANDOM
10224,8325,2530
2)扩大随机数范围
生成2个随机数,并计算相乘的结果
    	乘积结果的范围:0~32767*32767即0~1073676289
    	结合$[]表达式计算
$ echo $[RANDOM*RANDOM]
2240002
$ echo $[RANDOM*RANDOM]
128939216
$ echo $[RANDOM*RANDOM]
180268324
3)减小随机数范围
将随机数与指定的阀值相除,取余数
    	比如%1000,则求模结果的范围:0~999
    	结合$[]表达式计算
$ echo $[RANDOM%1000]
246
$ echo $[RANDOM%1000]
18
$ echo $[RANDOM%1000]
632

7.整数序列

1)使用seq命令;根据指定条件输出一组整数
    	默认从整数1开始;缺省的增量不长也是1
seq命令格式
   		seq 末数
    	seq 首数 末数
    	seq 首数 步长 末数
e.g.从1开始的一组整数
格式:seq 末数
    	默认的分隔符是换行(\n)
    	选项-s可用来自定义字符串作为分隔符
$ seq 4 //从1~4的整数序列,每行一个
1
2
3
4
$ seq -s' ' 10 //从1~10的整数序列,以两个空格分隔
1  2  3  4  5  6  7  8  9  10
2)限定区间的一组整数
格式:seq 首数 末数
    	默认按整数值的实际位数显示
    	选项-w可以显示等宽效果,不足的数会添加前置0
$ seq 8 10      //从8~10的整数序列,不等宽
8
9
10
$ seq -w 8 10       //从8~10的整数序列,加前置0等宽
08
09
10
3)限定区间及步长
	格式:seq 首数 步长 末数
$ seq 10 20 50      //从10~50的整数序列,步长为20
10
30
50
$ seq -w -s ' ' 0 50 500    //从0~500的整数序列,步长为50

二、小数运算处理

1.数值运算的局限性

  • Bash内建机制仅支持整数值运算
  • expr命令、$[]表达式 不支持有小数的运算
$ expr 123 + 45.678
expr:参数数目错误
$ echo $[3.14*2]
-bash:3.14*2:syntax error:invalid arithmetic operator (error token is ".14*2")

2.使用bc计算器

多数Linux系统默认安装此工具
        1)支持高精度的数值运算
        2)直接运行bc可进入交互式运算界面,quit退出
        3)设置scale=n可约束小数位
$ bc        //打开bc计算器程序
12.34*56.78 //提交表达式
700.66
scale=4     //将可用的小数位增加为4
12.34*56.78 //重新计算表达式
700.6652
quit        //退出计算器
$ 

3.结合管道向bc发送表达式

  • 多个表达式以分号分隔
  • 通过echo命令+管道传递要计算的表达式
$ A=12.34
$ echo "$A*56.789" " bc             //计算单个表达式
$ echo "scale=4;$A*56.789;5/3" | bc //计算多个表达式
700.7762
1.6666

4.小数值的比较(应用)

基本用法
        echo "数值1 比较符 数值2" | bc
如果表达式成立,则返回的计算结果为1,否则返回0
        常见比较操作:>  >=  <  <=  ==  !=
        $ A=12.34;B=56.78
$ echo "$A<=$B" | bc        //比较A是否小于或等于B
1
$ echo "$A>$B" | bc         //比较A是否大于B
0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值