变量的数值计算常见的有如下几个命令:
(()) 、let 、expr、bc 、$[]
1)(()) 用法:(此法很常用,且效率高)
用于执行简单的整数运算,只需将特定的算数表达式"$(("和"))" 括起。
shell 的算术运算符号都置于"$(("....."))"的语法中。这一语法如同双引号功能,除了内嵌双引号无需转义。
zhang@zhang:~$ ((a=1+2**3-4%3))
zhang@zhang:~$ echo $a
8
zhang@zhang:~$ b=$((1+2**3-4%3))
zhang@zhang:~$ echo $b
8
zhang@zhang:~$ echo $((1+2**3-4%3))
8
zhang@zhang:~$
提示: ** 为幂运算
zhang@zhang:~$ echo $a
8
zhang@zhang:~$ echo $((a+=1))
9
zhang@zhang:~$ echo $((a++))
9
zhang@zhang:~$ echo $a
10
zhang@zhang:~$ echo $((++a))
11
zhang@zhang:~$ echo $a
11
zhang@zhang:~$
提示:变量在前,先输出变量值,变量在后,就是先运算后输出变量的值,不管前置++还是后置++,其结果都是自增1。跟其它编程语言类似。
zhang@zhang:~$ echo $((3>2))
1
zhang@zhang:~$ echo $((3>5))
0
zhang@zhang:~$
注:上面涉及到的参数变量 必须为整数(整型)。不能使小数(浮点数)或者字符串。
简单的四则计算器:
zhang@zhang:~/Code/Shell$ cat cal.sh
#!/bin/bash
echo $(($1$2$3))
zhang@zhang:~/Code/Shell$ /bin/bash cal.sh 5+7
12
zhang@zhang:~/Code/Shell$ /bin/bash cal.sh 5*7
35
zhang@zhang:~/Code/Shell$ /bin/bash cal.sh 7/5
1
zhang@zhang:~/Code/Shell$ /bin/bash cal.sh 7%5
2
zhang@zhang:~/Code/Shell$
格式:
let 赋值表达式
注:let 赋值表达式功能等同于:((赋值表达式)),但效率没有(())高
zhang@zhang:~/Code/Shell$ i=4
zhang@zhang:~/Code/Shell$ let i=i+4
zhang@zhang:~/Code/Shell$ echo $i
8
zhang@zhang:~/Code/Shell$
expr 命令一般用于整数值,但也可用于字符串,用来求表达式变量的值,同时expr也是一个手工命令行计算器。
zhang@zhang:~/Code/Shell$ expr 2+2
2+2
zhang@zhang:~/Code/Shell$ expr 2 + 2
4
zhang@zhang:~/Code/Shell$ expr 2 * 2
expr: 语法错误
zhang@zhang:~/Code/Shell$ expr 2 \* 2
4
zhang@zhang:~/Code/Shell$
注意:运算符左右都有空格。
使用乘号时,必须用反斜线屏蔽其特定含义。因为shell 可能会误解星号的含义。
增量计数
expr在循环中可用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法为命令替代。最基本的一种是从(expr)命令接收输出并将之放入循环变量。
expr 判断输入是否是数值
zhang@zhang:~/Code/Shell$ cat judge_int.sh
#!/bin/bash
read -p "please input integer:" a
expr $a + 0 &>/dev/null
[ $? -eq 0 ] && echo int || echo not int
zhang@zhang:~/Code/Shell$ /bin/bash judge_int.sh
please input integer:9
int
zhang@zhang:~/Code/Shell$ /bin/bash judge_int.sh
please input integer:a
not int
zhang@zhang:~/Code/Shell$
通过expr 计算字符串的长度
zhang@zhang:~/Code/Shell$ vars=`seq -s " " 100`
zhang@zhang:~/Code/Shell$ echo ${#vars}
291
zhang@zhang:~/Code/Shell$ echo $(expr length "$vars")
291
zhang@zhang:~/Code/Shell$
bc命令是一种支持任意精度的交互执行的计算器语言。
示例:
zhang@zhang-virtual-machine:~$ seq -s "+" 10
1+2+3+4+5+6+7+8+9+10
zhang@zhang-virtual-machine:~$ seq -s "+" 10 | bc
55
zhang@zhang-virtual-machine:~$ echo "scale=4;65 / 24" | bc
2.7083
zhang@zhang-virtual-machine:~$ echo "obase=2;8" | bc
1000
zhang@zhang-virtual-machine:~$
scale 设定小数精度(数值范围),参数scale=4是将bc输出结果的小数位设置为4位。
obase 进制转换 ,参数obase=2是指转成二进制。
zhang@zhang-virtual-machine:~$ i=15
zhang@zhang-virtual-machine:~$ echo $i
15
zhang@zhang-virtual-machine:~$ echo $[i+15]
30
zhang@zhang-virtual-machine:~$ echo $i
15
zhang@zhang-virtual-machine:~$ i=$[i+15]
zhang@zhang-virtual-machine:~$ echo $i
30
zhang@zhang-virtual-machine:~$
推荐使用$(()) 这种方式来进行简单运算。