Shell 脚本变量默认是作为字符串处理,而不是数字,这使得在 Shell 脚本做数学运算显得较为复杂。在保持脚本编程规范和更好的算术支持方便,Perl 和 Python 会是更好的选择。但是你仍然可以选择在 Shell 中进行算术。事实上,过去许多年来,Unix 已经增加多种特性来支持数字处理。

备注:正如下文所示,一些帮助处理数字的命令在某些方便表现仍不够完善,例如运算符周围的空格。

declare


  在 Shell 中你无需提前声明变量,但如果你提前声明一个整型变量,那么以下示例将展示整型变量是如何工作的:

$ n=/
$ echo $n
/
$ declare -i n
$ n=/
$ echo $n

  如果你决定使用一个已有的程序或者内置命令来处理算术,那么你完全可以不用 declare 语句。

expr


  expr 是一个比较老的 Unix 程序可以用来算术求值。expr 在 Bourne Shell 时期开始广为人知,因为 Bourne Shell 不支持算术。但在 Bash 和 Korn Shell 中,一般不再使用它。使用 expr 时,仍然是把变量当作一个字符串来处理,并且它对空格处理也不够灵活,要求在表达式中使用空格分隔变量。

$ z=
$ z=`expr $z+` ---- Need spaces around + sign.
$ echo $z
+
$ z=`expr $z + `
$ echo $z

let


  Bash 和 Korn Shell 内置处理算术的命令是 let。它对空格处理也有点不灵活,和 expr 相反,它要求变量之间不能使用空格。

$ let z=
$ echo $z $ let z=$z+
$ echo $z $ let z=$z + # --- Spaces around + sign are bad with let
-bash: let: +: syntax error: operand expected (error token is "+") $let z=z+ # --- look Mom, no $ to read a variable.
$echo $z

  如果不想为空格烦扰,那么请使用双括号来包裹整个语句,这样有无空格都可以顺利求值。

$ ((e=))
$ echo $e $ (( e = e + ))
$ echo $e $ (( e=e+ )) # -- spaces or no spaces, it doesn't matter
$ echo $e

bc


 如果要处理浮点数字或者更复杂一点的运算怎么办?let 命令不能支持浮点数字,因此需要使用 bc 命令,但是你必须将整个运算表达式当作一个字符串来交给 bc 处理。

  如果你使用 let 命令处理浮点会得到以下错误示例:

$let r=3.5
-bash: let: r=3.5: syntax error in expression (error token is ".5")
$(( r = 3.5 ))
-bash: ((: r = 3.5 : syntax error in expression (error token is ".5 ")

  bc 命令可以处理任意精度的数学运算。bc 有交互模式和 shell 脚本命令两种模式。在交互模式下,使用 cntrl-d(EOF) 或者 quit 指令退出。

  交互模式:

$ bc
bc 1.06
Copyright -, , , Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
+ obase= <cntrl-d>

  脚本模式:

$r=3.5
$s=`echo "$r + 2.2" | bc`
$echo $s
5.7 $ z = `echo $z + | bc`
-bash: z: command not found
# -- spaces around = sign are bad
(shell thing, not bc) $ z=`echo "$z + 1" | bc`
$ echo $z $ z=`echo "$z+1" | bc` -- spaces don't matter with bc
$ echo $z

数字布尔值表达式


 INTEGER1 -eq INTEGER2  : INTEGER1 等于 INTEGER2

  INTEGER1 -ge INTEGER2  : INTEGER1 大于或等于 INTEGER2

  INTEGER1 -gt INTEGER2  : INTEGER1 大于 INTEGER2

  INTEGER1 -le INTEGER2  : INTEGER1 小于或等于 INTEGER2

  INTEGER1 -lt INTEGER2  : INTEGER1 小于 INTEGER2

  INTEGER1 -ne INTEGER2  : INTEGER1 不等于 INTEGER2

  以下两个 if 语句是等效的:

if (( x < y )); then
statements
fi if [ $x -lt $y ]; then
statements
fi

  对于浮点算术,bc 返回 1 表示真,0 表示假:

if [ $( echo "$t < 3.4" | bc ) -eq  ]; then
statements
fi

参考一

[Shell] Shell 中的算术的更多相关文章

  1. Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

    Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...

  2. shell脚本中的[]/[[]]区别

    转自:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html 引用: http://www.51testing.com/?uid- ...

  3. [ SHELL编程 ] shell编程中数值计算方法实例

    SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表 ...

  4. shell脚本中的各种表达式介绍和使用

    #前言:在shell脚本中,有各种的表达式,包括有条件测试表达式,文件表达式,字符串表达式,整数表达式,接下来我们来了解一下他们的使用方法 1.条件测试表达式 #首先来看一下条件测试语法 #条件测试语 ...

  5. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  6. 向shell脚本中传入参数

    写一个 程序名为    test.sh    可带参数为 start 和 stop 执行  test.sh start执行  start 内容的代码 执行 test.sh stop 执行 stop 内 ...

  7. shell脚本中的反引号使用 `

    反引号是~的英文切换 在shell脚本中,反引号允许将shell命令的输出赋值给变量. test=`date` 这样shell会执行反引号中的命令.并将执行的结果赋值给变量tests.

  8. Shell脚本中执行mysql的几种方式(转)

    Shell脚本中执行mysql的几种方式(转) 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用 ...

  9. Shell脚本中执行sql语句操作mysql

    对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...

随机推荐

  1. RIP路由协议及工作原理

    RIP路由协议及工作原理 RIP(Routing information Protocol,路由信息协议)是应用较早.使用较普遍的内部网关协议(Interior Gateway Protocol,IG ...

  2. 关于Unity中GrabPass截屏的使用和Shader的组织优化

    GrabPass截屏 可以用来截屏,截屏后把纹理传给下一个通道使用. 1:使用抓屏通道, GrabPass {} 或 GrabPass { “ 纹理名称”}; 使用GrabPass {}后,可以用_G ...

  3. maven学习日记(三)-------开发环境搭建(springmvc+hibernate4)各种maven错误汇总

    1.maven编码 gbk 的不可映射字符 解决这个问题的思路: 在maven的编译插件中声明正确的字符集编码编码——编译使用的字符集编码与代码文件使用的字符集编码一致!! 安装系统之后,一般中文系统 ...

  4. 使用Unity中的Box Collider组件完成游戏场景中的碰撞检测功能

    一.介绍 目的:通过Unity自带的组件完成游戏场景中的碰撞检测功能. 软件环境:Unity 2017.3.0f3 二.实现过程 1,在面板中点击Add Component按钮 2,添加Box Col ...

  5. Unity Package Manager Error的解决方案

    问题来源 启动Unity时显示 fail to start Unity Package Manager,软件环境为 Unity 2017.3.0f3. 解决方案 根据网上所给的方案,我选择添加环境变量 ...

  6. (转)谈谈RTP传输中的负载类型和时间戳

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ticktick.blog.51cto.com/823160/350142 最近被 ...

  7. system.web下的HttpModules节点和system.webServer下的modules节点的配置区别

    [转]自定义HttpModule的一些经验--配置篇 自定义web模块,需继承System.Web.IHttpModule接口 一:拦截对该服务器所有的http请求. 第一步:将自定义module类使 ...

  8. 查看已装TensorFlow的版本和路径

    pyhton Python 2.7.14... >>>import tensorflow as tf >>>tf.__version__ '1.3.0'>&g ...

  9. [AngularJS] tips技巧收集

     单个参数调用angular.module(),用来取得该模块而不是定义新的 这样就可以在不同的地方定义app的controller而不用通过全局变量 angular.module('myapp') ...

  10. mac ssh中文乱码解决

    网上有如下解决法,至少我没有成功过: vim ~/.bash_profile export LC_ALL='zh_CN.utf8' 来源:http://www.liuhuadong.com/archi ...