SHELL脚本攻略(学习笔记)--1.6 数学运算和bc命令



本文目录:

1.6.1 基本整数运算

1.6.2 bc命令高级算术运算



使用let、$(())或$[]进行基本的整数运算,使用bc进行高级的运算,包括小数运算。其中expr命令也能进行整数运算,还能判断参数是否为整数,具体用法见expr命令全解

1.6.1 基本整数运算

[[email protected] tmp]# str=10
[[email protected] tmp]# let str=str+6  # 等价于let str+=6
[[email protected] tmp]# let str-=5     # 等价于let str=str-5
[[email protected] tmp]# echo $str
11

如果想在命令行中做计算,则可以使用$(())或$[]。

[[email protected] ~]# str=10
[[email protected] ~]# echo $((str+=6))
16

[[email protected] ~]# echo $[str=str-6]
10

当然,在为变量赋算术值的时候也可以使用$(())和$[]。

[[email protected] ~]# str=10
[[email protected] ~]# str=$((str+=6));echo $str
16

[[email protected] ~]# str=$[str-=6];echo $str
10

其实,在算数计算过程中,等号右边的变量是可以带上$符号的,但等号左边的变量不允许带上$符号,因为它是要操作的变量,不是引用变量。例如:

[[email protected] ~]# let str=$str-1         # 等价于let str=str-1
[[email protected] ~]# str=$(($str-1))        # 等价于str=$((str-1))
[[email protected] ~]# srt=$[$str-1]          # 等价于str=$[str-1]
[[email protected] ~]# echo $((str=$str-1))  # 等价于echo $((str=str-1)),但不能写成echo $(($str=str-1))
[[email protected] ~]# echo $[str=$str-1]    # 等价于echo $[str=str-1],但不能写成echo $[$str=str-1]

还可以自增、自减运算。"++"和"--"表示变量自动加1和减1。但是位置不同,返回的结果是不同的。

x++:先返回结果,再加1

++x:先加1再返回结果

x--:先返回结果,再减1

--x:先减1再返回结果

假如x的初始值为10,则echo $[x++]将显示10,但在显示完后(即返回结果之后),x的值已经变成了11,再执行echo $x将返回11。

[[email protected] ~]# x=10;echo $((x++));echo $x
10
11

如果此时再echo $[x++]仍将返回11,但此时x已经是12了。

[[email protected] ~]# echo $((x++));echo $x
11
12

再将x变量的初始值初始化为10,则echo $[++x]将显示11,因为先加1后再赋值给x,echo再显示x的值。++x完全等价于x=x+1,它们都是先加1后赋值。

[[email protected] ~]# x=10;echo $((++x));echo $x
11
11

同理自减也是一样的。

因此,在使用自增或自减进行变量赋值时,需要注意所赋的值是否加减立即生效的。例如:

[[email protected] ~]# x=10;y=$((x++));echo $y;echo $y
10
10

因为y=$((x++))赋给y的值是加1前的值,虽然赋值结束后,$((x++))已经变成11,但这和y无关。

所以,对于自增自减类的变量赋值应该使用先计算再显示的"++x"或"--x"的方式。

[[email protected] ~]# x=10;y=$((++x));echo $y;echo $y
11
11

总结下数值变量的赋值运算的方法:

let i=i-1

let i=$i-1

let i-=1

i=$((i-1))

i=$(($i-1))

i=$[ i - 1 ]

i=$[ $i - 1 ]

echo $((i=i-1))

echo $((i=$i-1))

1.6.2 bc命令高级算术运算

bc可用于浮点数的计算,是linux中的计算器。

以下是一个基本的功能示例:

[[email protected] ~]# bc
b 1.06.95          # 首先输出bc的版本信息,可以使用-q选项不输出头部信息
Copyright 1991-1994, 197, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty‘.
pie=3.1415   # 可以变量赋值
pie*3*3      # 运算时不需要空格
28.2735
r=3
pie*r*r
28.2735
pie*r^2      # 可以使用幂次方
28.2735
r=3 /* 将半径设置为3 */  # 还可以使用C语言风格的注释

输入quit命令可以退出bc计算器。

还支持自增和自减的功能。

[[email protected] ~]# bc -q
r=3
r++
3
r++
4
++r
6
++r
7
--r
6

bc运算器有一个内建的变量scale,用于表示计算的精度,默认精度为0,所以除法运算的默认结果是整数。

13/(1+3)
3
scale=3
13/(1+3)
3.250

更人性化的功能是可以通过命令替换来实现批处理模式的计算。

它的一般格式参考如下:

var=`echo "option1;option2;...;expression"|bc`

其中options部分一般设置精度scale,和变量赋值,expression部分是计算表达式,最后将它们放在反引号中赋值给变量。如:

[[email protected] ~]# area=`echo "scale=2;r=3;3.1415*r*r"|bc`

[[email protected] ~]# echo $area
28.2735

由于是在命令行中指定,所以这样的使用方式限制较多。bc接受使用here string和here document的方式接收参数。最常做法是将它们放置于脚本中。

#!/bin/bash
# script for calculate something

var1=haha
var2=hehe

value=`bc<<EOF  # 在反引号中使用here string的方式
scale=3
r=3
3.1415*r*r
EOF`
echo $value

以下是计算1+2+...+10的几种不同方式,要求输出在屏幕上的结果为"1+2+3+4+5+6+7+8+9+10=计算结果",这是非常不错的例子。

[[email protected] tmp]# echo $(seq -s "+" 10)=`seq -s "+" 10|bc`
1+2+3+4+5+6+7+8+9+10=55
[[email protected] tmp]# echo $(seq -s "+" 10)=$((`seq -s "+" 10`))
1+2+3+4+5+6+7+8+9+10=55
[[email protected] tmp]# echo $(seq -s "+" 10)=$(seq -s " + " 10|xargs expr)  # 注意"+"和" + "
1+2+3+4+5+6+7+8+9+10=55

回到系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/7231870.html

时间: 2024-09-29 03:04:45

SHELL脚本攻略(学习笔记)--1.6 数学运算和bc命令的相关文章

SHELL脚本攻略(学习笔记)--1.7 expr命令全解

expr命令可以实现数值运算.数值或字符串比较.字符串匹配.字符串提取.字符串长度计算等功能.它还具有几个特殊功能,判断变量或参数是否为整数.是否为空.是否为0等. 先看expr命令的info文档info coreutils 'expr invocation'的翻译. 16.4.1 字符串表达式 ------------------------- 'expr'支持模式匹配和字符串操作.字符串表达式的优先级高于数值表达式和 逻辑关系表达式. 'STRING : REGEX' 执行模式匹配.两端参数

《Linux Shell脚本攻略》 笔记 第一章:Shell起步基础

<Linux Shell脚本攻略> 笔记 第一章:Shell起步基础 1.变量:在bash中,每一个变量的值都是字符串.无论你给变量赋值时,有没有使用引号,值都会以字符串的形式存储. 2.var=value; //赋值操作 var = value: //相等操作 3.获取字符串的长度 [[email protected] ~]$ var=yang [[email protected] ~]$ length=${#var} [[email protected] ~]$ echo $length

《Linux Shell脚本攻略》 笔记 第二章:常用命令

<Linux Shell脚本攻略> 笔记 第二章:常用命令 1.cat cat -s //多个空白行压缩成一个 cat *.txt | tr -s '\n'   //移除空白行 cat -n //加行号 2.find 沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作. eg: find ./ ! -name "*.txt" -print [[email protected] program_test]# find ./  -type f -name "

《Linux Shell脚本攻略》 笔记 第三章:文件操作

<Linux Shell脚本攻略> 笔记 第三章:文件操作 1.生产任意大小的文件 [[email protected] dd_test]# [[email protected] dd_test]# dd if=/dev/zero of=junk.data bs=1k count=10 10+0 records in 10+0 records out 10240 bytes (10 kB) copied, 0.00137023 s, 7.5 MB/s 2.文件系统相关测试 [ -f $file

《Linux Shell脚本攻略》 笔记 第四章:高效文本处理

<Linux Shell脚本攻略> 笔记 第四章:高效文本处理 1.IP地址的正则表达式: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 2.grep用法 //在多级目录中对文本进行递归检索 [[email protected] program_test]# grep "yang" ./ -Rn ./test.txt:6:laoyang ./right.txt:1:1 yang man //忽略大小写匹配 [[email pr

《Linux Shell脚本攻略》 笔记 第六章:打包压缩

<Linux Shell脚本攻略> 笔记 第六章:打包压缩 //1.打包.解包 [[email protected] program_test]# tar -cf output.tar 11.txt 22.txt 33.txt [[email protected] program_test]# tar -xf output.tar -C ./tar-file/  //-C指定要提取到哪个路径? //列举出归档文件中的内容 [[email protected] program_test]# ta

Linux Shell 脚本攻略阅读笔记第1章 小试牛刀

一.简介 1.Bash(Bourne Again Shell),目前大多数GNU/Linux系统默认的shell环境. 命令都是在shell终端中输入并执行.打开终端后,提示符的形式:[email protected]$       或    [email protected] #     ($表示普通用户,#表示管理员用户root) 2.shell脚本是一个以#!(shebang)起始的文本文件,如下:   #!/bin/bash shebang是一个文本行,其中#!位于解释器路径之前./bi

LINUX SHELL脚本攻略笔记[速查]

Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述符和重定向 cat 数组和关联数组 alias date 调试脚本 函数和参数 管道 读取命令输出 read 字段分隔符和迭代器 循环 比较和测试 find xargs tr md5sum sha1sum 对目录进行校验 sort uniq tempfile split bash变量匹配切分 exp

Linux Shell脚本攻略(1.12)

1.12 函数和参数 和其他脚本语言一样,Bash同样支持函数,并且可以传递参数. 1.12.1 函数定义和传参 #!/bin/bash function fname() #也可以用fname()代替 { echo $1,$2; #访问参数1和参数2 echo "[email protected]"; #以列表的方式一次性打印所有参数 echo "$*"; #类似于[email protected],但是参数被作为单个实体 return 0; #返回值 } fnam