博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell算术运算与进制运算
阅读量:5908 次
发布时间:2019-06-19

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

(())与let是等效的 arithmetic expression

type 与[是等效的

source与.是等效的

 

其实,Shell(这里是Bash)本身不具备处理浮点计算的能力,但是可以使用“bc”这个高精度的计算器工具来帮助,另外,也可以在Bash中调用“awk”脚本来处理浮点运算。

shell可以在不调用第3方命令,表示不同进制数据。这里总结以下表示方法。shell 脚本默认数值是由10 进制数处理,除非这个数字以某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值。如:以 0 开头就是 8 进制.以0x 开头就是16 进制数.使用 BASE#NUMBER 这种形式可以表示其它进制.BASE值:2-64. adj octal    八进制的 decimal    十进制的 hexadecimal  十六进制的 ((表达式)),(())里面可以是任意数据表达式。如果前面加入:”$”可以读取计算结果。其它进制转为10进制[root@250-shiyan prog]# ((num=2#0111011));echo $num59[root@250-shiyan prog]# ((num=0123));echo $num83[root@250-shiyan prog]# ((num=0x1e));echo $num30[root@250-shiyan prog]# ((num=8#123));echo $num830-9a-f[root@250-shiyan prog]# ((num=16#56c));echo $num13880-9a-zA-Z[root@250-shiyan prog]# ((num=64#Z));echo $num61[root@250-shiyan prog]# ((num=64#_));echo $num6310进制转其它进制这里使用到:bc外部命令完成。bc命令格式转换为:echo "obase=进制;值"|bc[root@250-shiyan prog]# echo "obase=2;8"|bc1000[root@250-shiyan prog]# echo "obase=8;9"|bc11shell内置各种进制表示方法非常简单。记得base#number 即可。这里记得赋值时候用(())符号。不能直接用=号了。=号没有值类型。默认将后面变成字符串了。如:0开头已经失去了意义了。可以通过定义符:let达到(()) 运算效果。[root@250-shiyan prog]# num=0123;echo $num0123[root@250-shiyan prog]# let num=0123;echo $num83

 

echo "$(echo 'scale=2;40*100/90' | bc)%"

[root@84-monitor newmonitor]# ssh 192.168.2.109 echo "`echo "scale=3;2*3/7"|bc`"

使用awk来处理浮点计算和浮点数比较 #!/bin/bash# author: Jay 
# some examples for playing with floating point number. # basic usage of 'bc' tool in Bash.a=3.33b=3.3c=$(echo "$a + $b" | bc)d=$(echo "$a * $b" | bc)e=$(echo "scale=5; $a / $b" | bc)echo "c=a+b=$a+$b=$c"echo "d=a*b=$a*$b=$d"echo "e=a/b=$a/$b=$e" # "-l" parameter for 'bc' means using math library.pi=$(echo "scale=10; 4*a(1)" | bc -l)s=$(echo "s($pi/6)" | bc -l)echo "pi=$pi"echo "s=sin(pi/6)=$s" # use more options of 'bc' toolr=$(echo 'ibase=10;obase=2; 15+16' | bc)echo "binary of (15+16) is $r" # comparison for floating point numbers using 'bc'big=100small=99.9if [ $(echo "$big > $small" | bc) -eq 1 ]; then echo "$big is bigger than $small"fi # deal with floating point numbers with 'awk' languageecho $(awk -v x=10 -v y=2.5 'BEGIN {printf "10/2.5=%.2f\n",x/y}')v=$(echo $big $small | awk '{ printf "%0.8f\n" ,$1/$2}')echo "$big / $small = $v" echo $big $small | awk '{if($1>$2) {printf"%f > %f\n",$1,$2} else {printf"%f <%f\n",$1,$2}}'master@jay-linux:~/workspace/mygit/shell/sh2012$ ./floating-point.shc=a+b=3.33+3.3=6.63d=a*b=3.33*3.3=10.98e=a/b=3.33/3.3=1.00909pi=3.1415926532s=sin(pi/6)=.49999999994373819220binary of (15+16) is 11111100 is bigger than 99.910/2.5=4.00100 / 99.9 = 1.00100100100.000000 > 99.900000master@jay-linux:~/workspace/mygit/shell/sh2012$ cat temp.bc3+83/8scale=2; 3/8 master@jay-linux:~/workspace/mygit/shell/sh2012$ bc -q temp.bc110.37

 

 

[root@250-shiyan sh]# bash let

2.22
[root@250-shiyan sh]# cat let
var=2
i=`echo "scale=2;$var*1.11"|bc`
echo $i
shell程序中的操作默认都是字符串操作
在bash中只提供了整数运算,一般shell通过let和expr这两个指令来实现。
使用格式为: let "x=$x+1" 或者x=`expr $x+1`,同时,在shell中,也可以通过((表达式))。使用格式为:((x=$x+1))
shell脚本只提供整数算术运算(三种方式)—((表达式))、let "表达式"、value=`expr 表达式右边`
整数运算
将需要运算的表达式写入在expr 后面,保证参数与运算符号中间有空格隔开。
这其中的let可以用(())代替,let "j=i*6+2″等价于((j=i*6+2)), 就像很多的循环中用法一样
注意:let必须是完整的算术表达式,即有等号两边
(())、expr 可以只有等号右边的计算,由$((...))、$(expr ...)、`expr ...` 查看返回结果
let表达式内变量不用加$
let中运算符与操作数不能有空格,expr中运算符与操作数必须有空格

(( expression ))与let EXPRESSION是等效的

浮点运算
var=1
var=`echo "scale=1;$var*2.0"|bc`  bc预设输出整数,用scale 指定小数点下位数
echo $var
output:
2.0
bc支持除位运算以外的所有运算。
另外一个支持浮点运算的方法是awk:
var=1
var=`echo "$var 1"|awk '{printf("%g",$1+$2)}'`
echo $var
output:
2
$ c=$(awk 'BEGIN{print 7.01*5-4.01 }')
$ echo $c
1:在shell 中$() 与 ``等效。执行中间包含的命令语句,返回执行结果。
2:从效率来说let==(()) > expr > bc。let和(())运行是内建命令,使用相同的算法。
3:let 和 expr 的运算是整数运算,不包括浮点预算。
4:expr和bc是外部程序,expr的体积几乎等于bc的1/3,执行一次装入内存所消耗的时间就不一样。
5:从运算能力来说,bc排第一位。
let命令具有返回值.当计算结果(若有多个表达式时,以最后一个为准)为0时,
返回值为1,否则为0.
当表达式中含有shell的特殊字符(如|)时,需要用引用符('或")将其引用起来.
使用let时还需要注意的时,对于let x+y这样的式子,shell虽然计算了x+y的值
但却将结果丢弃,若不想这样,可以使用let sum=x+y将x+y的结果保存在变量sum中
另外还可以使用((和))操作符取代let命令,而且这样的话,还可以省去对算术
表达式的引用,如果想返回表达式的值,则需用$(())的格式.
if的条件中,“=”用于比较字符串;“-eq”用于比较整型数。
Bash shell 的算术运算有四种方式:
1:使用 expr 外部程式
加法 r=`expr 4 + 5`
echo $r
注意! '4' '+' '5' 这三者之间要有空白
r=`expr 4 * 5` #错误
乘法 r=`expr 4 \* 5`
2:使用 $(( ))
r=$(( 4 + 5 ))
echo $r
3:使用 $[ ]
r=$[ 4 + 5 ]
echo $r
乘法
r=`expr 4 \* 5`
r=$(( 4 * 5 ))
r=$[ 4 * 5 ]
echo $r
除法
r=`expr 40 / 5`
r=$(( 40 / 5 ))
r=$[ 40 / 5 ]
echo $r
减法
r=`expr 40 - 5`
r=$(( 40 - 5 ))
r=$[ 40 - 5 ]
echo $r
求余数
r=$[ 100 % 43 ]
echo $r
乘幂 (如 2 的 3 次方)
r=$(( 2 ** 3 ))
r=$[ 2 ** 3 ]
echo $r
注:expr 沒有乘幂
4:使用let 命令
加法:
n=10
let n=n+1
echo $n #n=11
乘法:
let m=n*10
echo $m
除法:
let r=m/10
echo $r
求余数:
let r=m%7
echo $r
乘冪:
let r=m**2
echo $r
虽然Bash shell 有四种算术运算方法,但并不是每一种都是跨平台的,建议使用expr。
另外,我们在 script 中经常有加1操作,以下四法皆可:
m=$[ m + 1]
m=`expr $m + 1`
m=$(($m + 1))
let m=m+1

转载于:https://www.cnblogs.com/createyuan/p/4193167.html

你可能感兴趣的文章
以构造函数和原型法重新实现定时器封装
查看>>
深入理解javascript原型和闭包(1)——一切都是对象
查看>>
在AD09中查找元件和封装
查看>>
在Eclipse中使用JUnit4进行单元測试(0基础篇)
查看>>
JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
查看>>
ibatis中<![CDATA[使用解释
查看>>
pl/sql 实现归并算法 (合并插入法的优化)
查看>>
用nodejs搭建最简单、轻量化的http server(转)
查看>>
int 与 string::length()
查看>>
说说C#的async和await(转)
查看>>
Android 图片的缩略图
查看>>
php中strlen和{}的效率对比
查看>>
swift1.2语言函数和闭包函数介绍
查看>>
MYSQL——数据类型
查看>>
在 ASP.NET MVC4 中使用 NInject
查看>>
防止表单重复提交的几种思路
查看>>
IOS开发基础知识--碎片22
查看>>
heredoc和nowdoc的区别
查看>>
java学习笔记2015-6-6
查看>>
MAC 如何使用Github Desktop 客户端
查看>>