[Shell] Shell 中的算术

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

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

declare



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

$ n=6/3
$ echo $n
6/3
$ declare -i n
$ n=6/3
$ echo $n
2

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

expr



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

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

let



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

$ let z=5
$ echo $z
5
$ let z=$z+1
$ echo $z
6
$ 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 $z
7

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

$ ((e=5))
$ echo $e
5
$ (( e = e + 3 ))
$ echo $e
8
$ (( e=e+4 ))  # -- spaces or no spaces, it doesn‘t matter
$ echo $e
12

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 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty‘.
3 + 2
5
obase=2
12
1100
<cntrl-d>

  脚本模式:

$r=3.5
$s=`echo "$r + 2.2" | bc`
$echo $s
5.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 $z
8
$ z=`echo "$z+1" | bc`  -- spaces don‘t matter with bc
$ echo $z
9

数字布尔值表达式



 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 1 ]; then
    statements
fi

参考一

[Shell] Shell 中的算术

时间: 2024-11-16 04:00:51

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

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

SHELL编程中经常会涉及到数值的相关计算,有时候对于这些计算命令的时候场景容易忘记或者混淆,这里针对常用的计算做一个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表达式必须是完整的表达式,即等号两边.只能赋值,不支持浮点数运算,不支持直接输出 $ var=10 $ let var+=2 #var=12,中间不能有空格 $ let var=var+2 #var=14 $ let var*=2 #var=28 $ let var/=2 # var=14

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

Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数,需要的朋友可以参考下 $#代表了命令行的参数数量,可以看以下实例: 复制代码 代码如下: if [ $# != 1 ] ; then echo "USAGE: $0 TABNAME" echo " e.g.: $0 CDR_CALL_20040701" exit 1; f

Linux下的shell脚本编程-变量-算术表达式-判断语句-if分支语句

Linux下的shell脚本编程-变量-算术表达式-判断语句-if分支语句 一:实验环境 1):虚拟机 2):linux系统 二:实验目标 1): shell 基本语法 2):变量 3):表达式 4):判断语句 5): if表达式 三:实验脚本 第一块 一个简单的shell脚本程序 [[email protected] ~]# mkdir test [[email protected] test]# vim example1.sh #!/bin/bash #This is to show wha

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

转自:http://www.cnblogs.com/include/archive/2011/12/09/2307905.html 引用: http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731 http://blog.csdn.net/sunboy_2050/article/details/6836382 shell 括号 学习shell的时候总是被shell里的条件判断方式搞得头疼,经常不知道改 用[],[[]],((

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

shell编程中for,while,util,case,select,break, continue用法详解

关于shell脚本的更多详细实例讲解请参考:http://www.cnblogs.com/yuexiaxiaoxi/category/646749.html Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for.while和until.while循环和for循环属于"当型循环",而until属于"直到型循环".循环控制符:break和continue控制流程转向. 参考:<Linux 与unix shell 编程指

[shell]shell中if语句的使用

转自:http://lovelace.blog.51cto.com/1028430/1211353 bash中如何实现条件判断?条件测试类型:    整数测试    字符测试    文件测试 一.条件测试的表达式:    [ expression ]  括号两端必须要有空格    [[ expression ]] 括号两端必须要有空格    test expression组合测试条件: -a: and -o: or !:  非 二.整数比较: -eq 测试两个整数是否相等 -ne 测试两个整数是

Shell脚本中替换字符串等操作

在做shell批处理程序时候,常常会涉及到字符串相关操作. 有非常多命令语句.如:awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号.能够达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.推断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var同样     ${var-DEFAULT} 假设var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 假设var没有被声明, 或者其值为空