Bash的算术运算有以下几种方法:

序号 名称 语法 范例
1 算术扩展 $((算术式)) r=$((2+5*8))
2 使用外部程序 expr 算术式 r=`expr 4 + 5`
3 使用 $[] $[算术式] r=$[4+5]
4 使用内置命令 declare declare -i 变量=算式式 declare -i r=8+16
5 使用内置命令 let let 算术式 let r=8+16

第一节:算术扩展

算术扩展语法:$((算术式))

如果表达式中有变量,该变量名称之前最好不要加$这个符号,以免该变量不存在时,造成语法的错误。

例如:

unset i
echo $((12+$i))

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

但如果写成:

echo $((12+i))

这样可正确执行,因为 12+i 在$(())中是一个合法的算术表达式,就算变量i不存在,仍然可正确计算(结果为 12)。

如果表达式中有“变量扩展”,则要加上$,例如: echo $((${j:-8}+2))。

这里强化一下印象:

$((12+i)) 正确范例
$((12+$i)) 当i不存在时,语法错误,不建议使用
$((12+${i})) 当i不存在时,语法错误,不建议使用
$((${j:-8}+2)) 表达式中有“变量扩展”的正确范例

以下是各种简单的算术运用:

1、加 r=$((6+5)):r的值为11。

2、减 r=$((6-5)):r的值为1。

3、乘 r=$((6*5)):r的值为30。

4、除 r=$((6/5)):r的值为1。注意,这是整除。

5、求余数 r=$((32%3)):r的值为2。

6、递增 1

r=6
r=$((++r))

行2,r的值加1后,在赋值给r,因此,r的值递增1,变成7。

7、递减1

r=6
r=$((--r))

行2,r的值减1后,再赋值给r,因此,r的值递减1,变成5.

8、运算后减1

m=6
r=$((4+m--))

行2,m的值先代入6,和4做加法运算,得值为10,再赋值给r。接着,m的值减1。运算结果:r=10,m=5。

如果要对变量本身做单元的算术运算,可使用 (()) 含括,这一点和 C 语言的语法很像。

如下所示:

1、指定运算

((i=168))

设定变量i的值为168

2、后置式递增

i=168
((i++))

i的值加1,变成169。

第2行改成前置式递增 ((++i)) 也可以。

3、后置式递减

i=168
((i--))

i的值减1,变成167.

第2行改成前置式递减 ((--i)) 也可以。

4、+= , -= , *= , /= 等 赋值运算

i=168
((i+=60))

i+=60 的意思同于 i=i+60,即i加上60后,把运算结果再赋值给i,i的值变成228。

5、三元表达式

i=168
((n=i<100?50:80))
echo $n

(()) 的用户其实和 let 的效果是一样的,例如:((i++)) 和 let "i++" 执行结果相同。可以把上述的 (())的用法都改用 let 来做。

第二节:使用外部程序 expr 做算术运算

外部程序 expr 本来作用,是在“标准输出”显示表示式的值。语法为:

expr '算术式'

例如:

expr 3 + 2

它会在屏幕上显示 5。

利用这个特性,expr 就可以拿来当做一种算术运算的工具。而且,由于它是外部程序,和Shell的版本没什么关系,几乎在各种操作系统平台上都可以执行。因此,如果注重跨平台、可移植性,在script程序的开发上可以使用expr替代其他算术方法。

在使用expr时,要特别注意“算术式”中是否含有bash shell的特殊字符,如 *、|、<、>、!、&、(、)等。如果有的话,要用 \ 予以转义,否则会出现奇怪的错误信息。

另外,在“算术式”中,运算符合操作数之间,至少要有一个以上的空格符隔开。

以下是 expr 的范例(请注意,这里是使用一对 ` 符号含括,而不是单引号):

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`

3、加

r=`expr 4 + 5`

r的值为9。

4、减

r=`expr 4 - 5`

r的值为-1。

5、递减1

r=5
r=`expr $r + 1`

第三节:使用$[]做算术运算

使用$[]做算术运算和$(())类似。

语法:r=$[算术式]

以下列出简单的算术运用:

1、加:r=$[4+5]

2、减:r=$[4-5]

3、乘:r=$[4*5]

4、除:r=$[22/5] (整除)

5、求余数:r=$[100%43],r的值为14。

6、递增1

r=5
r=$[r+1]

第四节:使用内置命令 declare 做算术运算

语法:declare -i 变量=算式式

例如:

declare -i k
k=8+16 echo $k

行1,使用declare事先设定变量k的属性为“整数”。

行2,由于k是整数,8+16就不再是字符串,而是一个算式,因此,bash会对它进行运算,最后把结果24赋值个k。

必须注意的是:

  • 算式中,运算符和操作数之间不可以有空格符,要紧密连接。
  • 特殊符号不必使用 \ 转义。例如:乘法*,乘法**。
  • 算式中,可包含其他变量,变量之前不必加上$。

使用 declare -i 设定变量之后,加减乘除等运算,就非常直观了:

declare -i k

k=8+16
k=16-8
k=5*3
k=22/5
k=2**3
k=100%43 declare -i j
j=k+1 #或 j=$k+1
echo $j

行3~8,分别是加、减、乘、除、乘方、求余数等运算。

行10,设定变量j也是整数。

行11,算式中可以包含变量,但不必加上‘$’;k的变量值代入其中,加1后,赋值给变量j。

第五节:使用内置命令 let 做算术运算

let 的用法也很简单,其注意事项同 declare。

以下是let的范例:

let k=8+16
let k=16-8
let k=5*3
let k=22/5
let k=2**3
let k=100%43
let j=k+1

其意自明,这里就不再赘述了。

另外,可以使用“空格符”让表达式可读性高一些,但这时,必须使用“引号”含括表达式才行,比如:

let "k = k + 5"

Shell入门教程:算术运算的更多相关文章

  1. Linux Bash Shell入门教程

    Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...

  2. Shell入门教程:Shell变量

    变量 是一种很“弱”的变量,默认情况下,一个变量保存一个串,Shell不关心这个串是什么含义.所以若要进行数学运算,必须使用一些命令例如 let.declare.expr.双括号等. Shell变量可 ...

  3. Shell入门教程:Shell当中的特殊变量

    Shell当中的特殊变量 一.保留变量 $IFS 这个变量中保存了用于分割输入参数的分割字符,默认识空格. $HOME 这个变量中存储了当前用户的根目录路径. $PATH 这个变量中存储了当前 She ...

  4. Shell入门教程:Shell的基本结构

    shell程序的基本组成结构 shell结构大体是由设定变量.内置命令.shell的语法结构.函数组成. 使用实例说明:test.sh #!/bin/bash #说明使用/bin/bash作为这个脚本 ...

  5. Shell入门教程:流程控制(1)命令的结束状态

    在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环 ...

  6. 【重点】Shell入门教程:流程控制(2)条件判断的写法

    第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可 ...

  7. 【重点】Shell入门教程:流程控制(3)条件判断式的真假值

    之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断.传回0,即为真:传回非0,即为假. 在Bash中,这种可以影响程序流程的式子,称为条件判断式.判断式的操作数分成“单元”及 ...

  8. Shell入门教程:流程控制(6)while 循环

    while循环的语法: while 条件测试 do     命令区域 done 举例: #!/bin/bash declare -i i=1 declare -i sum=0 while ((i< ...

  9. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

随机推荐

  1. js/jquery/html前端开发常用到代码片段

    1.IE条件注释 条件注释简介 IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力,是WEB设计中常用的hack方法.条件注释只能用于IE5以上,IE ...

  2. 三维网格补洞算法(Radial Basis Function)

    在逆向工程中,由于设备或模型的原因,我们获取得到的三维模型数据往往并不完整,从而使得生成的网格模型存在孔洞,这对后续的模型分析会造成影响.下面介绍一种基于径向基函数(RBF:Radial Basis ...

  3. NOIP2013货车运输[lca&&kruskal]

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  4. 关于ipa和apk文件的解压

    移动互联网中,主要的两个平台是Android和ios,android上文件的安装包是后缀名为apk的文件,ios上文件的安装包是后缀名为ipa的文件,在本文分析一下这两种文件的特点,以及如何用程序去解 ...

  5. 关于jQuery中实现放大镜效果

    1.1.1 摘要 相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果. 在接下来的博文中,我们将向 ...

  6. Lrc2srt精灵,增加自定义输出编码

    2015.4.8 对中文支持有点问题,修改了一下,支持自定义输出编码! 修改了建议行末偏移,通常100到200最好了,人的反应时间! http://files.cnblogs.com/files/ro ...

  7. 关于包含pom.xml的开源项目如何导入

    1. 开源项目导入eclipse的一般步骤 2. 使用Eclipse构建Maven项目 (step-by-step) 3. 第一次安装和使用maven

  8. IIS部署SSL,.crt .key 的证书,怎么部署到IIS,记录一下,以免忘记。

    SSL连接作用不说,百度很多.因为最近想考虑重构一些功能,在登录这块有打算弄成HTTPS的,然后百度了,弄成了,就记录一下,以便以后万一部署的时候忘记掉. 做实验的时候,拿的我个人申请的已经备案的域名 ...

  9. python基础-函数式编程

    python基础-函数式编程  高阶函数:map , reduce ,filter,sorted 匿名函数:  lambda  1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层 ...

  10. Freemarker判断是否为空

    1.判断对象是否为空 freemarker中显示某对象使用${name}. 但如果name为null,freemarker就会报错.如果需要判断对象是否为空: <#if name??> - ...