一、shell中支持的算术
算术运算符 | 说明/含义 |
---|---|
+、- | 加法(或正号)、减法(或负号) |
*、/、% | 乘法、除法、取余(取模) |
** | 幂运算 |
++、– | 自增和自减,可以放在变量的前面也可以放在变量的后面 |
!、&&、|| | 逻辑非(取反)、逻辑与(and)、逻辑或(or) |
<、<=、>、>= | 比较符号(小于、小于等于、大于、大于等于) |
==、!=、= | 比较符号(相等、不相等;对于字符串,= 也可以表示相当于) |
<<、>> | 向左移位、向右移位 |
~、|、 &、^ | 按位取反、按位或、按位与、按位异或 |
=、+=、-=、*=、/=、%= | 赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1 |
二、shell中数学计算方式
运算操作符 | 说明 |
---|---|
(( )) | 用于整数运算,效率很高,推荐使用。 |
let | 用于整数运算,和 (()) 类似。 |
$[] | 用于整数运算,不如 (()) 灵活。 |
expr | 可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。 |
bc | Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。 |
1、(()) 用法
用法:((表达式1,表达式2,....))
只用于整数运算,表达式可以有一个或多个,也可以使用$(())来获取运算结果
示例:
[root@localhost ~]# ((1+2+3))
[root@localhost ~]# ((a=1+2+3))
[root@localhost ~]# echo $a
6
[root@localhost ~]# echo $((1>2))
0
[root@localhost ~]# echo $((2/3+2))
2
[root@localhost ~]# a=$((1>2||4<5))
[root@localhost ~]# echo $a
1
[root@localhost ~]# ((a=1+2+3,b=3+4+5))
[root@localhost ~]# echo $a $b
6 12
[root@localhost ~]# a=$((4*5))
[root@localhost ~]# echo $a
20
2、bc用法
bc 命令是任意精度计算器语言,通常在linux下当计算器用。
(0)bc计算器内置变量/函数
变量名 | 作 用 |
---|---|
scale | 指定精度,也即小数点后的位数;默认为 0,也即不使用小数部分。示例:scale=5,设置精度为小数点后5位 |
ibase | 指定输入的数字的进制,默认为十进制。示例:ibase=2,设置输入的数字为二进制 |
obase | 指定输出的数字的进制,默认为十进制。示例:obase=8,设置计算结果输出为八进制 |
内置函数,使用时要在打开bc计算器后加-l参数,表示启用数学库
函数名 | 作用 |
---|---|
s(x) | 计算 x 的正弦值,x 是弧度值。 |
c(x) | 计算 x 的余弦值,x 是弧度值。 |
a(x) | 计算 x 的反正切值,返回弧度值。 |
l(x) | 计算 x 的自然对数。 |
e(x) | 求 e 的 x 次方。 |
j(n, x) | 贝塞尔函数,计算从 n 到 x 的阶数。 |
[root@localhost ~]# bc -l #加-l表示启用数学库
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'.
s(10)
-.54402111088936981340
a=10
e(a)
22026.46579480671651695790
(1)终端交互使用bc计算器
在命令行直接输入bc
即可进入到计算器
[root@localhost ~]# 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'.
1+2+3 #计算表达式1+2+3的值
6 #计算结果
2*2.5
5.0
2/2.5
0
1/3
0
n=1+2+3 #将表达式的值给n
n #输出n的值
6
n++ #n自增
6
n
7
scale=5 #设置精度5
1/3
.33333
10/3
3.33333
scale=2 #设置精度2
10/3
3.33
ibase=2 #设置输入数字为2进制
1+10001+1
19
ibase=10 #设置输入数字为10进制
obase=2 #设置输出数字为2进制
1+2+3*2
1001
1+2+3*2.5
1010.1000
(3)shell中使用bc计算器
借助管道符|
使用bc计算器
用法1:直接输出结果echo "计算表达式" | bc
用法2:结果赋给变量var=$(echo "表达式" | bc)
或var=`echo "表达式"|bc`
[root@localhost ~]# echo "1+2*3"|bc
7
[root@localhost ~]# echo "(8+2)/10"|bc
1
[root@localhost ~]# echo "(8+2)/3"|bc
3
[root@localhost ~]# echo "scale=5;(8+2)/3"|bc #设置输出精度5
3.33333
[root@localhost ~]# echo "scale=5;a=10;a/3"|bc
3.33333
[root@localhost ~]# echo "ibase=8;obase=2;a=10;a"|bc #将八进制10转换成二进制
1000
[root@localhost ~]# a=$(echo "1+2+3"|bc) #将计算结果赋给a
[root@localhost ~]# echo $a
6
[root@localhost ~]# a=$(echo "s(10)"|bc -l) #使用数学库sin(10)
[root@localhost ~]# echo $a
-.54402111088936981340
[root@localhost ~]# i=`echo "1*2"|bc`
[root@localhost ~]# echo $i
2
[root@localhost ~]#
也可以参考这里:https://blog.youkuaiyun.com/qq_43469158/article/details/114789485
三、案例
kfc点餐系统
#!/bin/bash
clear
kl=9.9
jc=12.3
hb=19.9
echo "-------------------------------------------------"
echo -e "|\t\t Welecome to KFC\t\t|"
echo "-------------------------------------------------"
echo -e "|今天KFC提供的菜品有:\t\t\t\t|"
echo -e "|\t1)可乐\t\t\t\t\t|\n|\t2)鸡翅\t\t\t\t\t|\n|\t3)汉堡\t\t\t\t\t|"
echo -e "|请输入你要购买的数量:\t\t\t\t|"
echo "-------------------------------------------------"
read -p "可乐:" numkele
read -p "鸡翅:" numjichi
read -p "汉堡:" numhanbao
sum=`echo "scale=2;$kl*$numkele+$jc*$numjichi+$hb*$numhanbao"|bc`
read -p "合计:$sum元 请付款: " usermoney
clear
echo -e "\t\tKFC结算单\t\t"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo -e "商品\t单价\t数量\t合计"
echo -e "可乐\t$kl\t$numkele\t`echo "scale=2;$kl*$numkele"|bc`"
echo -e "鸡翅\t$jc\t$numjichi\t`echo "scale=2;$jc*$numjichi"|bc`"
echo -e "汉堡\t$hb\t$numhanbao\t`echo "scale=2;$hb*$numhanbao"|bc`"
echo -e "\n总计:$sum"
echo "支付:$usermoney"
echo "找零:`echo "scale=2;$usermoney-$sum"|bc`"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "地址:陕西省西安市西三环28号KFC "
echo "联系电话:400-689-3400"
echo "www.kfc.com更多优惠等你来拿"