本文参考文章:1)https://blog.csdn.net/taiyang1987912/article/details/38893381;
2)https://blog.csdn.net/hansel/article/details/8736775?utm_source=app
数学运算的4种方式
1.使用 expr 外部程式
r=`expr 4 + 5`
echo $r
注意!!! ‘4’ ‘+’ ‘5’ 这三者之间要有空白
r=`expr 4 \* 5` #*之前要加转义,否则错误
乘法: r=`expr 4 * 5`,注意*前要加\转义字符
除法:r=`expr 40 / 5` # 这里不需要转义
2.使用 $(( ))
整数扩展。这种扩展计算是整数型的计算,不支持浮点型。
r=$(( 4 + 5 )) # 括号中加不加空格,都可以
echo $r
乘法:r=$(( 4 * 5 ))
除法:r=$(( 40 / 5 ))
另外还有以下用法
- 只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo
$((16#5f)) 结果为95 (16进位转十进制)。 - 单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6
- 常用于算术运算比较,双括号中的变量可以不使用 符 号 前 缀 。 括 号 内 支 持 多 个 表 达 式 用 逗 号 分 开 。 只 要 括 号 中 的 表 达 式 符 合 C 语 言 运 算 规 则 , 比 如 可 以 直 接 使 用 f o r ( ( i = 0 ; i < 5 ; i + + ) ) , 如 果 不 使 用 双 括 号 , 则 为 f o r i i n ‘ s e q 04 ‘ 或 者 f o r i i n 0..4 。 再 如 可 以 直 接 使 用 i f ( ( 符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in `seq 0 4`或者for i in {0..4}。再如可以直接使用if (( 符号前缀。括号内支持多个表达式用逗号分开。只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)),如果不使用双括号,则为foriin‘seq04‘或者foriin0..4。再如可以直接使用if((i<5)), 如果不使用双括号, 则为if [ $i
-lt 5 ]。
3.使用 $[ ]
r=$[ 4 + 5 ] # []中加不加空格,都可以
echo $r
乘法:r=$[ 4 * 5 ]
除法:r=$[ 40 / 5 ]
余数:r=$[ 100 % 43 ]
4.使用let 命令
let expressions 执行一个或多个表达式。变量和运算符之间不能有空格,否则要用引号括起。表达式中的变量前不必有$。
加法:

n=10
let n=n+1
echo $n #n=11
乘法:
let m=n*10
echo $m
除法:
let r=m/10
echo $r
求余数:
let r=m%7
echo $r
乘幂:
let r=m**2
echo $r
注意
虽然Bash shell 有四种算术运算方法,但并不是每一种都是跨平台的,建议使用expr。
另外,我们在 script 中经常有加1操作,以下四种方法都可以:
m=$[ m + 1]
m=`expr $m + 1`
m=$(($m + 1)) # 这里的m也可以不加$
let m=m+1 # 注意这里的m变量前不需要加$
数学运算符
算术运算符
使用let命令来执行算术运算,除法和取余运算过程中要注意除数不能为0。
其中算术运算符有以下几种:
算术运算符与赋值运算符"="联用,称为算术复合赋值运算符。
位运算符
用于整数间的运算,按位与运算只有两个二进制都为1,结果才为1;按位或运算只要有一个二进制位为1,则结果为1;按位异或运算两个二进制位数相同时,结果为0,否则为1。按位取反运算符将二进制中的0修改成1,1修改成0。
位运算符同样可以同赋值运算符联用,组成复合赋值运算符。
自增自减运算符
自增自减运算符包括前置自增、前置自减、后置自增和后置自减。自增自减操作符的操作元只能是变量,不能是常数或表达式,且该变量值必须为整数型。
#!/bin/sh
num1=5
let "a=5+(++num1) "
echo "a=$a"
num2=5
let "b=5+(num2++) "
echo "b=$b"
数字常量
Shell脚本或命令默认将数字以十进制的方式进行处理,当使用0作为前缀时表示八进制,当使用0x进行标记时表示十六进制,同时还可使用num#这种形式标记进制数。
#!/bin/sh
let "num1=40"
echo "num1=$num1" # num1=40
let "num2=040"
echo "num2=$num2" # num2=32
let "num3=0x40"
echo "num3=$num3" # num3=64
使用num#实例:
#!/bin/sh
let "num1=2#1101100110001101"
echo "num1=$num1" # num1=55693
let "num2=8#50"
echo "num2=$num2" # num2=40
let "num3=16#50"
echo "num3=$num3" # num3=80
bash数学运算
(1)expr命令
expr一般用于整数值计算和字符串的操作。其操作符名称如下表所示。
注:若expr的操作符是元字符(不是普通字符),需要用转义符将操作符的特殊含义屏蔽,进行数学运算,如expr 2014 * 2。expr操作符的两端必须有空格,否则不会执行数学运算expr 5-1,得到结果5-1;而expr 5 - 1,得到结果4。
(2)bc运算器
bc是一种内建的运算器,是bash shell中最常用的浮点数运算工具,包括整型数和浮点数、数组变量、表达式、复杂程序结构和函数。
bc运算器支持的数学运算符号如下表: