博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Shell] Shell 中的算术
阅读量:5295 次
发布时间:2019-06-14

本文共 2492 字,大约阅读时间需要 8 分钟。

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

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

 

declare


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

$ n=6/3$ echo $n6/3$ declare -i n$ n=6/3$ echo $n2

 

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

 

expr


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

$ z=5$ z=`expr $z+1`   ---- Need spaces around + sign.$ echo $z5+1$ z=`expr $z + 1`$ echo $z6

 

let


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

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

 

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

$ ((e=5))$ echo $e5$ (( e = e + 3 ))$ echo $e8$ (( e=e+4 ))  # -- spaces or no spaces, it doesn't matter$ echo $e12

 

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 指令退出。

 

  交互模式:

$ bcbc 1.06Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type `warranty'.3 + 25obase=2121100

 

  脚本模式:

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

 

数字布尔值表达式


    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    statementsfiif [ $x -lt $y ]; then    statementsfi

 

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

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

 

 

转载于:https://www.cnblogs.com/ifantastic/p/3915448.html

你可能感兴趣的文章
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
使用Chrome(PC)调试移动设备上的网页
查看>>
使用gitbash来链接mysql
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
虚拟DOM
查看>>
uva 11468 Substring
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
BootStrap2学习日记2--将固定布局换成响应式布局
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
Spark的启动进程详解
查看>>
使用命令创建数据库和表
查看>>
数据库的高级查询
查看>>