shell 四则运算:expr,let,bc,(()),
1、expr的用法:
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
详细使用方式:expr --help
expr 表达式
表达式说明:
- 用空格隔开每个项;
- 用 / (反斜杠) 放在 shell 特定的字符前面;
- 对包含空格和其他特殊字符的字符串要用引号括起来
使用实例:
1、计算字串长度
> expr length "this is a test" 14
2、抓取字串
> expr substr "this is a test" 3 5 is is
3、抓取第一个字符数字串出现的位置
> expr index "sarasara" a 2
4、整数运算
> expr 14 % 9 5 > expr 10 + 10 20 > expr 1000 + 900 1900 > expr 30 / 3 / 2 5 > expr 30 \* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义) 90 > expr 30 * 3 expr: Syntax error
2、let的用法:
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。
语法格式
let arg [arg ...]
参数说明:
arg:要执行的表达式
实例:
自加操作:let no++
自减操作:let no--
简写形式 let no+=10,let no-=20,分别等同于 let no=no+10,let no=no-20。
以下实例计算 a 和 b 两个表达式,并输出结果:
#!/bin/bash let a=5+4 let b=9-3 let c=7/4let d=4*6let e=1+4*6+3*2+2let f=1+4*6+3*2+2+8/5 echo $a $b $c $d $e $f
以上实例执行结果为:
9 6 1 24 33 34
有些用法区别去expr:
let 不需要空格隔开表达式的各个字符。而 expr 后面的字符需要空格隔开各个字符。
# expr 实例 $ s=`expr 2 + 3` $ echo $s 5 # let 实例 $ let s=(2+3)*4 $ echo $s
3、(()) 的用法:
echo $((运算表达式))
echo $((1+4*6+3*2+2+8/7))
34
4、bc的用法
bc 命令是任意精度计算器语言,通常在linux下当计算器用。
它类似基本的计算器, 使用这个计算器可以做基本的数学运算。
常用的运算:
- + 加法
- - 减法
- * 乘法
- / 除法
- ^ 指数
- % 余数
语法
bc(选项)(参数)
选项值
- -i:强制进入交互式模式;
- -l:定义使用的标准数学库
- ; -w:对POSIX bc的扩展给出警告信息;
- -q:不打印正常的GNU bc环境信息;
- -v:显示指令版本信息;
- -h:显示指令的帮助信息。
参数
文件:指定包含计算任务的文件。
实例
$ bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 2+3 5 5-2 3 2+3*1 5
输入 quit 退出。
通过管道符
$ echo "15+5" | bc 20
scale=2 设小数位,2 代表保留两位:
$ echo 'scale=2; (2.777 - 1.4744)/1' | bc 1.30
bc 除了 scale 来设定小数位之外,还有 ibase 和 obase 来其它进制的运算:
$ echo "ibase=2;111" |bc 7
进制转换
#!/bin/bash abc=192 echo "obase=2;$abc" | bc <pre> <p> 执行结果为:11000000,这是用bc将十进制转换成二进制。</p> <pre> #!/bin/bash abc=11000000 echo "obase=10;ibase=2;$abc" | bc
执行结果为:192,这是用bc将二进制转换为十进制。
计算平方和平方根:
$ echo "10^10" | bc 10000000000 $ echo "sqrt(100)" | bc 10
5、shell 浮点数除法计算:
样例:
echo $(printf "%.2f" `echo "scale=2;1/3"|bc`)
来源:https://www.cnblogs.com/lovychen/p/7760866.html