本文旨在总结shell编程中取算术运算数值的常用6种方法:let、(())、$[]、expr、bc以及awk

知识储备:


  • Bash原生是不支持算术运算的,默认会当作字符串来处理,如下例

1
2
3
4
5


#!/bin/bash
a=15+20
echo $a
#运行结果---->
[root@centos~]#15+20

  • 对于一些需要算术运算结果的片段,如何取得算术运算结果大致有以下6种方法,分别简单介绍

用法Let


注意点:

 <1>几乎支持所有运算,如++、--、括号优先级等,求幂次方用**

 <2>变量引用可以不带$号,如变量num1=num1+1

 <3>一般情况下算术表达式可以不加引号,若表达式中有bash关键字需加上

 <4>let后面的表达式只支持整数运算

代码实现:

1
2
3
4
5
6
7


#!/bin/bash

read -p "Enter 2 Num: " a b
let 
"sum=a+b"
let 
"mi=$a**$b"
echo 
"sum = $sum"
echo 
"mi = $mi"

wKioL1YBCBzDYo3dAAQfnKizksg217.bmp


用法(())


注意点:

 <1>用法、支持的运算基本同let,效果基本等价

 <2>变量引用可以不带$,建议带上

代码实现:

1
2
3
4
5


#!/bin/bash

read -p "Enter a number: " a
((a++))
echo $a

wKiom1YBBwyD0qBiAAN7eEv1z0w915.bmp


用法$[]


注意点:

 <1>使用比较广泛,意思是将中括号内的表达式作为数学运算先计算结果再输出

 <2>$[]中变量引用可不带$,但是建议带上

 <3>运算支持同let,但是只支持整数运算

代码实现:

1
2
3
4
5
6
7
8


#!/bin/bash

if [ $# -eq 0 ];then
        echo "Please pass a parameter before EXEC!"
        exit 
1
else
        echo 
"$1*10 = $[$1*10]"
fi

wKiom1YBCfSCu1xoAATH-KsLwaA443.bmp


用法expr


注意点:

 <1>一款表达式计算工具,能够完成表达式的求值操作,它本身是一个命令,可以直接使用

 <2>支持逻辑运算| & ,支持关系运算< <= = != ,支持算术运算+ - * / %

 <3>乘法必须使用转义 \*否则会连接字符串

 <4>表达式和运算符之间要有空格!正确格式 ARG1 - ARG2

 <5>默认只能保留整数位,不支持浮点数运算

代码实现:

1
2
3
4


#!/bin/bash

read -p "Enter 2 Num: " a b
echo `expr $a \* $b`

wKiom1YBDMLRVfINAATeOOPT7d4007.bmp


用法bc


注意点:

 <1>bc其实也是一个命令,是一个计算器程序,有些Linux未必自带

 <2>bc可以实现几乎所有运算,但是需要进入bc交互接口,所以在shell中使用管道来处理

 <3>支持浮点数运算,但是需要通过sacle指定精度

代码实现:

1
2
3
4
5


#!/bin/bash

var=
3.14
var=`echo 
"scale=2;$var*3"|bc`
echo $var

wKiom1YBE6TRrXhAAAN7eJUIcI0680.bmp


用法awk


注意点:

 <1>awk本质是一款文本处理、格式化报表输出工具,同时也可以作为一门编程语言

 <2>虽然bash原生不支持运算,但是awk支持众多运算,还能进行浮点运算

代码实现:

1
2
3
4
5


#!/bin/bash

var=
2.71
var=`echo 
"$var 2"|awk '{printf("%g",sin($1/$2))}'`
echo $var


wKioL1YBFveTOEhnAAOmuHGWyYo405.bmp