Shell数学运算
数学运算符合和指令
1、运算符号
1.1、运算符号说明
1.2、运算符号使用事项
- Shell 和其它编程语言不同,Shell 不能直接进行算数运算,必须使用数学计算命令。
- 在 Bash Shell中,如果不特别指明,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。
- 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串
[jmw]$ echo 2+8
2+8
[jmw]$ a=23
[jmw]$ b=$a+55
[jmw]$ echo $b
23+55
[jmw]$ b=90
[cjmw]$ c=$a+$b
[jmw]$ echo $c
23+90
2、计算命令
2.1、运算命令说明
2.2、运算命令使用实例
2.2.1、(( ))命令:整数运算
((表达式)) #数学运算表达式放在((和))之间
- 表达式可以只有一个,也可以有多个,多个表达式之间以
逗号,
分隔。对于多个表达式的情况,以最后一个表达式的值作为整个(( ))
命令的执行结果 - 可以使用
$
获取(( ))
命令的结果
[jmw]$ echo $((6-3))
3
[jmw]$ i=5
[jmw]$ ((i=i*2)) #可以简写为 ((i*=2))。
[jmw]$ echo $i #使用 echo 输出变量结果时要加 $。
10
[jmw]$ echo $((1+2**3-4%3)) #注意不要丢掉 $ 符号。
8
[jmw]$ b=$((1+2**3-4%3)) #运算后将结果赋值给变量,变量放在了括号的外面。
[jmw]$ echo $b
8
[jmw]$ echo $((3<8)) #3<8 的结果是成立的,因此,输出了 1,1 表示真
1
[jmw]$ echo $((8<3)) #8<3 的结果是不成立的,因此,输出了 0,0 表示假。
0
[jmw]$ if ((8>7&&5==5)) #如果 8>7 成立,并且 5==5 成立,那么输出 yes
> then
> echo yes
> fi
yes
[jmw]$ a=10
[jmw]$ echo $((a++)) #如果++在a的后面,那么在输出整个表达式时,会输出a的值,因为a为10,所以表达式的值为10。
10
[jmw]$ echo $a #执行上面的表达式后,因为有a++,因此a会自增1,因此输出a的值为11。
11
[jmw]$ a=11
[jmw]$ echo $((a--)) #如果--在a的后面,那么在输出整个表达式时,会输出a的值,因为a为11,所以表达式的值的为11。
11
[jmw]$ echo $a #执行上面的表达式后,因为有a--,因此a会自动减1,因此a为10。
10
[jmw]$ ((a=3+5, b=a+10)) #先计算第一个表达式,再计算第二个表达式
[jmw]$ echo $a $b
8 18
[jmw]$ c=$((4+8, a+b)) #以最后一个表达式的结果作为整个(())命令的执行结果
[jmw]$ echo $c
26
2.2.2、bc 命令:小数运算
- Linux bc 命令可以很方便的进行浮点运算,当然整数运算也不再话下
- 支持变量、数组、输入输出、分支结构、循环结构、函数等基本的编程元素
bc 命令还有一些选项
bc 有四个内置变量,我们在计算时会经常用到,如下表所示:
bc 还有一些内置函数:在输入 bc 命令时需要使用-l
选项,表示启用数学库
2.2.2.1、在 Shell 中使用 bc 计算器
在 Shell 脚本中,我们可以借助管道或者输入重定向来使用 bc 计算器。
- 管道是 Linux 进程间的一种通信机制,它可以将前一个命令(进程)的输出作为下一个命令(进程)的输入,两个命令之间使用
竖线|
分隔。 - 通常情况下,一个命令从终端获得用户输入的内容,如果让它从其他地方(比如文件)获得输入,那么就需要重定向。
1、终端进入 bc
在终端输入 bc
命令,然后回车,就可以进入 bc
你不想输入 bc 命令后显示一堆没用的信息,那么可以输入bc -q
:
2、终端退出 bc:quit
3、借助管道使用 bc 计算器
echo "expression" | bc
expression
就是希望计算的数学表达式,它必须符合 bc 的语法
扫描二维码关注公众号,回复:
11470582 查看本文章
将 bc
的计算结果赋值给 Shell 变量:
variable=$(echo "expression" | bc)
variable
就是变量名
实例
[jmw]$ echo "3*8"|bc
24
[jmw]$ ret=$(echo "4+9"|bc)
[jmw]$ echo $ret
13
//这里是scale=4,限制小数点位数
[jmw]$ echo "scale=4;3*8/7"|bc
3.4285
[jmw]$ echo "scale=4;3*8/7;last*5"|bc
3.4285
17.1425
//$x表示使用第一条 Shell 命令中定义的变量,n是在 bc 中定义的新变量,e(n) -l启用函数库,e的n次方
[jmw]$ x=4
[jmw]$ echo "scale=5;n=$x+2;e(n)"|bc -l
403.42879
//进制转换
#十进制转十六进制
[jmw]$ m=31
[jmw]$ n=$(echo "obase=16;$m"|bc)
[jmw]$ echo $n
1F
#十六进制转十进制
[jmw]$ m=1E
[jmw]$ n=$(echo "obase=10;ibase=16;$m"|bc)
[jmw]$ echo $n
30
参考
1、http://c.biancheng.net/view/1169.html
2、http://c.biancheng.net/view/2680.html