玩转Bash脚本:数值计算

总第6篇

Bash中的数学运算并不如其他语言般简便,因为Bash把所有变量都视作字符串,所以a=1+2,a并不等于3,而是等于字符串1+2。

为了解决这一问题,有如下几种方案。

运算符[ ]

a=2
b=3
c=$[a+b]
d=$[a-b]
e=$[a*b]
f=$[a/b]
g=$[a%b]

$符只是取变量值的意思。中括号和里面的表达式可以视作一个变量。在中括号中引用变量可以直接使用变量名,也可以使用$加变量名。比如:

c=$[$a+$b]

当然,你可以直接使用字面值:

c=$[2+3]
d=$[2-3]
e=$[2*3]
f=$[2/3]

需要注意的是:

  • 该运算只支持整数,如果a或者b是小数,则会报错。运算结果是小数的也会自动取整。
  • 该运算[ ]的操作符(+-*/)和变量之间可以有空格。即可写作c=$[a + b]

运算符(())

其用法和[ ]类似,注意事项也差不多。

expr及其反引用

普通计算

expr是一个外部命令(非Bash本身的命令),所以它是独立与Bash的,同样可以在其他Shell中使用。

a=2
b=3
expr $a + $b
expr $a - $b
expr $a \* $b
expr $a / $b
expr $a % $b

需要注意的是:

  • 操作符和操作数之间一定要有空格间隔
  • 操作数(即变量)前必须有$符
  • 乘号*,要用反斜杠\进行转义
  • 该命令会将计算结果打印到标准输出
  • 仅支持整数运算
  • 也可以直接使用数字的字面值

expr除了支持以上运算外,还支持其他运算,大家可以自行 man expr来查看。

赋值

那么如何将expr的计算结果赋值给一个变量呢?答案是:反引用。

我在《变量及其初始化》一节中介绍过用命令替换初始化的概念了。反引用只是命令替换方式的一种而已。

c=`expr $a + $b`

用bc进行浮点数运算

基本格式

以上我们介绍的各种数值计算方案,不管是shell内部的还是外部的,都有一个问题,那就是不支持小数运算。这应该是shell本身的使用环境所决定的,实际在脚本中进行小数运算的情况可能并不多。

如果我们想进行浮点数的运算该怎么办呢?答案是利用外部工具(或者说命令)bc。bc是一个交互式的计算器。你可以在shell中键入bc来进入bc的命令提示符。但同样bc也支持写入到脚本中来进行数值计算。这需要用到管道,所谓管道就是将前一个命令的标准输出,作为标准输入传递给后面的命令。关于管道的更多概念,在以后讲IO操作的时候会提及。

echo '45.36-22.33'|bc

单引号双引号,这里无所谓。实现的过程就是将一个数学表达式传递给bc这个计算器。然后bc会将结果打印到标准输出。

设置精度

浮点运算,有一个很重要的概念就是精度。bc这里的精度指的的是小数的位数。在使用bc来进行除法运算的时候,你会发现默认是取整的,即没有小数部分。

比如:echo ‘2/3‘|bc,它输出的是0。因为bc的默认精度是0。你可能会想到的解决方案是:echo ‘2.0/3‘|bc。但是输出结果依旧是0。

其他运算,比如加、减和乘。都会自动取操作数中的最大精度为输出结果的精度。

echo '2.0*3.00'|bc
echo '2.25+4.5'|bc
echo '5.66-7.888'|bc

输出结果为:

6.00
6.75
-2.228

但是除法不行,你必须手动设置。

 echo 'scale=3;2/3'|bc
.666

.666为输出的结果。因为设置了精度scale=3。前导0会被忽略。

bc功能强大,你甚至能直接利用bc来进行进制转换。

进制转换

obase为输出的进制,ibase为输入的进制。

自增自减

C类语言中都支持自增自减操作。即a++,b--,c+=2,d-=3这种类型的计算。其含义就不再介绍了。

进行自增自减运算需要注意的有两点:

  1. 操作数必须是变量
  2. 操作数必须是整数

Bash中要实现这一功能需要借助命令let(内部命令)。

时间: 2024-10-07 08:38:47

玩转Bash脚本:数值计算的相关文章

玩转Bash脚本:选择结构之case

总第5篇 之前,我们谈到了if. 这次我们来谈还有一种选择结构--case. case与if if用于选择的条件,不是非常多的情况,假设选择的条件太多.一系列的if.elif,.也是醉了. 没错,case在bash中的地位,和switch在C中的地位一样. 可是使用方法可大有不同. 代码块 不论什么语言都有代码块的概念,C语言中的花括号{ },python中的冒号和缩进.bash中的代码块风格不是非常统一.可是在选择结构中是同样的--反语.if结构使用if...fi标识一个代码块的作用域,而ca

玩转Bash脚本:循环结构之while循环

总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html 和其他语言一样Bash的循环结构中也有while语句. 基本结构 while 条件 do 循环体 done 和for语句一样,它的循环体同样是do-done结构.我们可以把while语句再折叠一下 while 条件;do 循环体 done 还能进一步折叠成一行体 while 条件;do 循环体;done Bash语句大都可以写作一行,只不过可读性

玩转Bash脚本:循环结构之while循环(转)

总第8篇 本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html 和其他语言一样Bash的循环结构中也有while语句. 基本结构 while 条件 do 循环体 done 和for语句一样,它的循环体同样是do-done结构.我们可以把while语句再折叠一下 while 条件;do 循环体 done 还能进一步折叠成一行体 while 条件;do 循环体;done Bash语句大都可以写作一行,只不过可读性

玩转Bash脚本:变量基本概念及其初始化

总第2篇 基本概念 命名 注意以下规则: 只能包含字母.数字和下划线,并且不能以数字开头 大小写敏感 不能和系统变量重名 除此以外,如果要导出为全局变量,名称最好要全部大写.这只是一种习惯的约定,并非严格的约束. 类型 几乎所有的编程语言都有变量的概念,Bash当然也不例外.说道变量就少不了说一说类型.但与其他语言不同的是Bash属于无类型语言,如果强要说一种类型,可以认为都是字符串.说到这里,你可能会说,Bash里面也有整数类型吧,好像有整数的运算.但其是通过一些运算符,表达式或者命令将字符串

玩转Bash脚本:循环结构之for循环

总第7篇 for循环 基本格式 for 变量 in 取值列表 do 各种操作 done 还有罕见的写法就是都写作一行里: for 变量 in 取值列表 ; do 各种操作 ;done 取值列表大致可以分成枚举和迭代两类 枚举 普通枚举 取值列表为空格或回车符分割的字符串 for i in 'apple' 'meat' 'sleep' 'woman' do echo I like $i done 在终端执行该脚本for.sh.运行结果 [email protected]:~$ bash for.s

玩转Bash脚本:特殊变量

总第4篇 在前面博文中我讲过了变量基础部分<变量基本概念及其初始化>.我们知道假如我们有初始化一个变量a=hello,那么如果我们想打印它的值,我们需要使用echo $a. 但是除此之外还有很多特殊的变量,可供 $ 使用.本文讲到了$0 # * @ _ ? ! -这几个特殊变量的含义. 脚本的参数 正如同C语言中有main(int argc,char **argv),Java中有main(String[]args)一样,Bash同样能对执行脚本时附加的参数做操作. 引用脚本的参数n 看一个简单

一个很不错的bash脚本编写教程

转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用.所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在 bash的大姐,bourne shell中运行). 如同其

Linux shell脚本数值计算个人心得

Linux shell脚本数值计算个人心得 本篇博客为,个人对与bash数值计算的一些心得与用法. Bash对于数值是没有明确定义的,在shell里面所有的数值都默认为字符串,并不是单纯的数值. 比如:a=1+2,a并不等于3,而是等于字符串1+2. 整数计算: 整数计算为整数型的数值加减乘除,没有浮点数的数值,就算浮点数的数值进行加减也会忽略小数点后面的数值. 表达式计算方法: 表达式1:$[EXPRESSION] 表达式2:$((EXPRESSION)) [ ] 和 (( )) 也被称为运算

献给命令行重度用户的一组实用 BASH 脚本

今天,我偶然发现了一组适用于命令行重度用户的实用 BASH 脚本,这些脚本被称为 Bash-Snippets,它们对于那些整天都与终端打交道的人来说可能会很有帮助.想要查看你居住地的天气情况?它为你做了.想知道股票价格?你可以运行显示股票当前详细信息的脚本.觉得无聊?你可以看一些 YouTube 视频.这些全部在命令行中完成,你无需安装任何严重消耗内存的 GUI 应用程序. 在撰写本文时,Bash-Snippets 提供以下 19 个实用工具: Cheat – Linux 命令备忘单. Clou