目录
摘要
count=0; let count++; echo $count #需包含let命令,注意此处直接使用变量名,不需要添加$符号,如果写成let $count++ , let会把count的值当做变量名执行运算,相当于执行 0++count=0;
result=$[ $count + 1 ]; echo $result #sh不支持、bash支持
count=0; result=$(expr $count + 1); echo $result #sh、bash都支持
count=0; result=$(echo "$count + 1" | bc); echo $result #需包含bc命令
count=4; result=$(echo "scale=4; $count / 3" | bc); echo $result
count=0; declare -i result=1+$count; echo $result
result=$(awk 'BEGIN {x=1.2;y=2.3;printf "%f",x+y }'); echo $result
详解
expr
expr命令也可用于整数运算。和其他算术运算方式不同,expr要求操作数和操作符之间使用空格隔开(否则只会打印出字符串),所以特殊的操作符要使用转义符转义(比如*)。
expr支持的算术运算符有加、减、乘、除、余等,不支持幂运算,示例如下:
[root@192 my-linux-shell]# var=100; result=$(expr $var + 1); echo $result
101
[root@192 my-linux-shell]# var=100; result=$(expr $var - 1); echo $result
99
[root@192 my-linux-shell]# var=100; result=$(expr $var * 2); echo $result
expr: syntax error
[root@192 my-linux-shell]# var=100; result=$(expr $var \* 2); echo $result
[root@192 my-linux-shell]# var=100; result=$(expr $var \% 3); echo $result
1
[root@192 my-linux-shell]#
$(()) 算术扩展
算术扩展是Shell提供的整数变量的运算机制,是Shell的内建命令之一。
其基本语法:$((算数表达式))
[root@192 my-linux-shell]# var=10; count=$(($var+2)); echo $count
12
[root@192 my-linux-shell]# var=10; count=$(($var-2)); echo $count
8
[root@192 my-linux-shell]# var=10; count=$(($var*2)); echo $count
20
[root@192 my-linux-shell]# var=10; count=$(($var/2)); echo $count
5
[root@192 my-linux-shell]# var=10; count=$(($var%2)); echo $count
0
[root@192 my-linux-shell]# var=10; count=$(($var**2)); echo $count
100
[root@192 my-linux-shell]#
let
let-算数运算
加 +
减 -
乘 *
除 \
幂 **
余 %
+=
-=
*=
/=
%=
puxl@vm-ubuntu:~$ var=100; let "var+=1"; echo $var
101
puxl@vm-ubuntu:~$ var=100; let "var-=1"; echo $var
99
puxl@vm-ubuntu:~$ var=100; let "var*=10"; echo $var
1000
puxl@vm-ubuntu:~$ var=100; let "var/=10"; echo $var
10
puxl@vm-ubuntu:~$ var=100; let "var%=3"; echo $var
1
puxl@vm-ubuntu:~$ var=5; let "var=$var**3"; echo $var
125
puxl@vm-ubuntu:~$
let-位运算
左移、右移、位与、位或、异或
>>
&
|
^
自增、子减
操作对象只能是变量,不能是常量或者表达式
++
--
puxl@vm-ubuntu:~/test$ var=100; let var++; echo $var
101
puxl@vm-ubuntu:~/test$ var=100; let var--; echo $var
99
puxl@vm-ubuntu:~/test$ var=100; let ++var; echo $var
101
puxl@vm-ubuntu:~/test$ var=100; let --var; echo $var
99
puxl@vm-ubuntu:~/test$
bc
前面介绍的几种算术运算都只能是基于整数的,但现实中有很多需求必须是基于浮点数进行的计算,比如说职工的工资、贷款的利率等,这就要求更高精度的计算。而Linux下的bc正是这样一款专门用于高精度计算的工具。
与其说bc是一个命令或者工具,不如说它是一门语言,bc的man文件对它的描述是:“一款高精度计算语言(An arbitrary precision calculator language)”,它有和常规编程语言一样的支持顺序执行、判断、循环等运行机制,还支持自定义函数等,功能非常强大。
在Linux下使用bc最简单的方式是直接输入bc命令,回车后进入bc的交互式界面,闪烁的命令提示符表明现在可以输入表达式了。
事实上,默认情况下bc并不显示小数部分,必须设置要显示的小数位数。这可以通过设置scale做到,本例中设置为4后再运行除法运算结果就正确了。
[root@192 my-linux-shell]# 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'.
a=100
b=3
a/b
33
scale=4
a/b
33.3333
quit
[root@192 my-linux-shell]#
通过命令替换+管道命令,把结算结果复制给指定变量
[root@192 my-linux-shell]# var1=100; var2=3; result=$(echo "scale=4; $var1 / $var2" | bc); echo $result
33.3333
[root@192 my-linux-shell]#
除此之外,bc还支持逻辑运算、比较运算。
$[]
[root@192 my-linux-shell]# var=100; result=$[ $var + 3]; echo $result
103
[root@192 my-linux-shell]# var=100; result=$[ $var - 3]; echo $result
97
[root@192 my-linux-shell]# var=100; result=$[ $var * 3]; echo $result
300
[root@192 my-linux-shell]# var=100; result=$[ $var / 3]; echo $result
33
[root@192 my-linux-shell]# var=100; result=$[ $var % 3]; echo $result
1
[root@192 my-linux-shell]# var=100; result=$[ $var ** 3]; echo $result
1000000
[root@192 my-linux-shell]#
declare
declare是Shell的内建命令,通过它们也能进行整数运算。
虽然说Shell可以不利用declare命令创建变量,但是通过下面的例子可以看到,它和显式使用declare定义变量的差别是很大的。
未经明确指定类型便赋值“1+100”,对Shell来说,此时的“1+100”只是一个字符串,和“abc”无异,所以打印出来也只是字符串。
-i 参数指定变量为“整数”,此时再赋值“1+100”,Shell会将后面的字符串解析成算术运算,所以打印出的值是算术表达式的计算值。
[root@192 my-linux-shell]# declare -i count=1+100; echo $count
101
[root@192 my-linux-shell]# count=1+100; echo $count
101
[root@192 my-linux-shell]# var=100; declare -i count=1+$var; echo $count
101
[root@192 my-linux-shell]# unset count; count=1+100; echo $count
1+100
[root@192 my-linux-shell]#