[Shell] Shell 中的算术
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 中的算术的更多相关文章
- Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载
Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...
- shell脚本中的[]/[[]]区别
转自:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html 引用: http://www.51testing.com/?uid- ...
- [ SHELL编程 ] shell编程中数值计算方法实例
SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表 ...
- shell脚本中的各种表达式介绍和使用
#前言:在shell脚本中,有各种的表达式,包括有条件测试表达式,文件表达式,字符串表达式,整数表达式,接下来我们来了解一下他们的使用方法 1.条件测试表达式 #首先来看一下条件测试语法 #条件测试语 ...
- 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器
本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...
- 向shell脚本中传入参数
写一个 程序名为 test.sh 可带参数为 start 和 stop 执行 test.sh start执行 start 内容的代码 执行 test.sh stop 执行 stop 内 ...
- shell脚本中的反引号使用 `
反引号是~的英文切换 在shell脚本中,反引号允许将shell命令的输出赋值给变量. test=`date` 这样shell会执行反引号中的命令.并将执行的结果赋值给变量tests.
- Shell脚本中执行mysql的几种方式(转)
Shell脚本中执行mysql的几种方式(转) 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用 ...
- Shell脚本中执行sql语句操作mysql
对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的 ...
随机推荐
- I2C上拉电阻
在一些PCB的layout中,大家往往会看到在I2C通信的接口处,往往会接入一个4.7K的电阻,有的datasheet上面明确有要求,需要接入,有的则没有要求. I2C接口 对于单片机来讲,有些I ...
- Ubuntu下Ruby的下载和编译源码安装
1.Ruby的下载 Ruby可以在Ruby 官网上下载,如果想获取更多的Ruby版本,可以到淘宝镜像网站下载. 2.Ruby的编译源码安装 解压 首先把下载下来的源码压缩包解压到自己指定的目录 编译安 ...
- 完全图解RNN、RNN变体、Seq2Seq、Attention机制
完全图解RNN.RNN变体.Seq2Seq.Attention机制 本文主要是利用图片的形式,详细地介绍了经典的RNN.RNN几个重要变体,以及Seq2Seq模型.Attention机制.希望这篇文章 ...
- 使用Photoshop合成两张不完整的图片
一.准备工作 软件环境:PhotoshopCS6 目标:将两张不完整的图片合并成一张完整的图片. 二.操作步骤 1,新建一张画布,参数:15*12厘米,像素300. 2,对第一张不完整的图片选择魔棒工 ...
- 第三百二十二节,web爬虫,requests请求
第三百二十二节,web爬虫,requests请求 requests请求,就是用yhthon的requests模块模拟浏览器请求,返回html源码 模拟浏览器请求有两种,一种是不需要用户登录或者验证的请 ...
- Unity--------------------万向锁的概念
万向锁 一直困惑我很久....原因出在这里,我以为欧拉角旋转是以模型坐标(齐次坐标系)为旋转轴.问题就来了,无论旋转那个轴,其它两个轴也会相应的变化,下面看图: 根据上面的说明两个旋转面(圆圈)怎么会 ...
- (转)BT1120接口及协议
因为项目上用到的是 海思3536的bt1120接口对接 FPGA.项目上用到的是 1920 x 1080,60Hz.逐隔. 上图看到, BT1120的接口 有 16根 数据线 和 一根 时钟线. 下面 ...
- WiFidog 广告路由可修改功能更加智能化的几点看法
海蜘蛛Tomato出了mini版,这个对很多做WiFi营销的朋友来说,是一个福音,因为可以直接从FIR302B,一台30多块钱的路由直接刷成Hi-WiFi,而且界面这么漂亮 相信很多人已经对此界面OE ...
- VS2013启动浏览器链接(BrowserLink),导致页面脚本错误和页面加载变慢
页面脚本出错场景:
- 《HTTP权威指南》学习笔记——HTTP报文
HTTP报文 HTTP:互联网的信使 HTTP报文:信使用来搬东西的包裹 1.报文流 HTTP报文:HTTP应用程序之间发送的数据块 组成:元信息开头(文本形式,描述报文的内容和含义)+可选的数据部分 ...