您的位置:首页 > 运维架构 > Shell

【转载】Linux Shell之四 算术运算

2017-11-16 11:19 197 查看
http://linuxnote.blog.51cto.com/9876511/1641189

在Bash的算术运算中有以下几种方法:
名称                语法                    范例

算术扩展            $((算术式))              r=$((1+2*3))

使用外部程序expr    expr 算术式              r=`expr 1+2*3`

使用$[]             $[算术式]                r=$[1+2]

使用内置命令        declare -i 变量=算术式    declare -i r=1+2*3

使用内置命令let     let 算术式                let r=1+2

i++运算后加1,i--运算后减1

++i运算前加1,--i运算前减1
一、算术扩展
算术扩展的语法是:$((表达式)),如果表达式中有变量,该变量之前最好不要加$这个符号,以免变量不存在造成语法错误,例:

unset i

echo $((2+$i))
由于变量i不存在,所以会变成 echo $((2+)),这样语法就错误了。

但如果写成echo $((2+i)),((2+i))是一个合法的算术式,就算变量不存在,仍可正确计算。

a=5

a=$((++1)) a的值加1后,在赋值给a

a=$((--1)) a的值减1后,在赋值给a

a=$((3+a--))运算后减1
二、使用外部程序expr做算术运算
外部程序expr本来的作用,是在“标准输出”显示表达式的值。这个是外部程序,和Shell没有关系,所以移植性非常好,

如果注重跨平台,那么可以在脚本本使用expr代替其他算术表达式。

expr 3 + 4  

它会在屏幕上显示7,注意"+"两边有空格。

在使用expr时,要特别"表达式"中是否包含shell的特殊字符,如*、|、<、>、!、&、(、),要使用"\"来转义。
1、r=`expr 参数1 \|参数2`
|代表"或"之意.如果”参数1“存在、非空、不是0,则传回”参数1“的值,否则传回"参数2"的值。 

r=`expr 3 \| 0` r的值为3

r=`expr 0 \| 2` r的值为2
2、r=`expr 参数1 \&参数2`
如果"参数1"和"参数2"都存在、非空、不是0,则传回"参数1"的值,否则传回0.

r=`expr 3 \& 0` r的值为0
3、比较

算术            是否成立    r的值

r=`expr 1 \< 2`      是        1 

r=`expr 3 \<= 2`     否        0 

r=`expr 2 \= 2`      是        1 

r=`expr 3 \!= 2`     是        1 

r=`expr 3 \>= 2`     是        1 

r=`expr 3 \> 2`      是        1 
4、加

r=`expr 4 + 5` r的值为9
5、减

r=`expr 3 - 5` r的值为-2
6、乘

r=`expr 3 \* 5` r的值为15
7、除

r=`expr 32 / 5` r的值为6(余数无条件舍去)
8、乘方

expr没有乘方的功能
9、求余数

r=`expr 32 % 5` r的值为2
10、计算字符串长度

r=`expr length "hello"`  r的值为5
三、用$[]做算术运算

使用$[]做算术运算和$(())类似
加:r=$[4+5]    r的值为9

减:r=$[4-5]    r的值为-1

乘:r=$[4*5]    r的值为20

除:r=$[5/2]    r的值为2

余数:r=$[5%2]  r的值为1

乘方:r=$[2**3] r的值为8
四、使用declare、let做算术运算
declare为bash shell的内置命令。

declare -i I

I=5+4 

echo $I 

因为I事先被定义为整数(算术运算),所以$I的值为9,而不再是字符串5+4

当被定义为整数后,便可以进行加、减、乘、除..等操作
五、用let做算术运算

let为bash shell的内置命令。

let I=8+4*5

echo $I 

此时输出的值为28

let表明后边的直接说一个算术式。

也可使用空格符让表达式可读性高一点,但这时必须使用引号包括表达式才行。

let "i = i + 5"

本文出自 “Just For Fun!” 博客,请务必保留此出处http://linuxnote.blog.51cto.com/9876511/1641189
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: