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. 对C语言中指针的入门理解

    通过一个例子引出对指针的概念理解 1,例子 #include<stdio.h> int main(void) { ; //小张的身高 ; //小李的身高 ; //小王的身高 int *xi ...

  2. unity-------------------Unity5.X 新版AssetBundle使用方案及策略

    Unity5.X 新版AssetBundle使用方案及策略   1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使 ...

  3. (弃)解读Openstack Identity API v2.0

    目前OpenStack社区提供了详尽的API文档,并配有丰富的说明和示例,关于Identity API v2查看这里, 关于Identity API v3请查看这里. 尽管现在官方已经不建议OpenS ...

  4. FusionCancer-人类癌症相关的融合基因的数据库

    RNA-seq 测序可以用于融合基因的发现,在过去的十几年里,RNA-seq 测序数据不断增加,发现的融合基因的数据也不断增加: FusionCancer 是一个人类癌症相关的融合基因的数据库,利用N ...

  5. bioperl 自动化下载genbank 中的序列

    当我们想要从genbank 中下载序列的时候,总需要点击右上角的download 按钮,选择对应的格式,然后通过浏览器进行下载,这样反复的点击很费时间了 其实可以通过bioperl 自动化的完成下载: ...

  6. t4 根据表名数组生成实体

    <#@ template debug="false" hostspecific="true" language="C#" #> ...

  7. git解决冲突(rebase版)

    当使用git rebase碰到冲突时, git rebase <Remote Branch>/<Your Branch> 信息如下: error: Failed to merg ...

  8. (Dos)/BAT命令入门与高级技巧详解(转)

    目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1.REM 和 :: 2.ECHO 和 @ 3.PAUSE 4.ERRORLEVEL 5.TITLE 6.COLOR 7.mode 配置系统设 ...

  9. ubuntu-12.04.5-desktop-i386.iso:ubuntu-12.04.5-desktop-i386:安装Oracle11gR2

    ubuntu 桌面版的安装不介绍. 如何安装oracle:核心步骤和关键点. ln -sf /bin/bash /bin/sh ln -sf /usr/bin/basename /bin/basena ...

  10. 比SRCNN效果好的传统超分辨率算法汇总

    1.基于深度协作表达的人脸图像超分辨率算法研究与应用_百度学术 采用一种深度协作表达算法框架,构造深度的多线性模型 分段拟合高低分辨率图像块之间的非线性关系,本文算法简洁高效,提供了一种新的深度学习模 ...