TypechoJoeTheme

MetMan's Blog

网站页面

Shell算术运算

MetMan博 主
2024-01-11
/
0 评论
/
147 阅读
/
448 个字
/
百度已收录
01/11
本文最后更新于 2024年01月11日,已超过 252天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

本文介绍shell编程时需要用到的整数算术和浮点运算。

整数运算

shell整数运算有多种实现方法。

使用 expr 命令

expr 表达式

示例:

r1=`expr 3 + 4`  # 操作数和操作符之间使用空格隔开
r2=`expr 3 - 4`
r3=`expr 3 \* 4` # 乘法操作符需要使用\*
r4=`expr 3 / 4`  # 整数除
r5=`expr 3 % 5`  # 整数取余

expr没有幂操作。

expr表达式中使用shell变量:

sum=`expr $r1 + $r2 + $r3 + $r4 + $r5`

使用算术展开

((表达式))

算术展开表达式的操作数和操作符之间不要求空格分隔。

前面示例等价于

r1=$((3+4))
r2=$((3-4))
r3=$((3*4))
r4=$((3/4))
r5=$((3%4))
r6=$((3**4))  # 增加幂操作

算术展开表达式中可以使用shell变量(不用加$):

sum=$((r1+r2+r3+r4+r5))

注:如果变量未定义,会默认其值为0,不会报错。

使用$[ ]

前面示例等价于

r1=$[3+4]
r2=$[3 - 4]
r3=$[ 3 * 4]
r4=$[ 3 / 4 ]
r5=$[3% 4]
r6=$[3**4]  # 幂操作,3的4次方
sum=$[r1+r2+r3+r4+r5]

以上故意写不同格式是为了说明其也不要求空格分隔。

let命令

前面示例等价于

let r1=3+4
let r2=3-4
let r3=3*4
let r4=3/4
let r5=3%4
let r6=3**4
let sum=r1+r2+r3+r4+r5

注意let表达式内部不能有空格,否则结果不对。

let r2=3-4     # 正确结果为-1
let r2=3 - 4   # r2结果为3
let r2=3- 4    # 语法错误

整数运算小结

个人比较喜欢使用算术展开$((expr))进行整数运算,不需要考虑空格分隔问题,Bash和ksh都支持该语法,但csh不支持。

几种shell都支持expr命令,可移植性好。

浮点运算

有时我们也需要在shell脚本中进行简单的浮点运算,但shell的内部算术运算符无法处理浮点数,当有浮点计算的需求时,需要借助外部命令工具。

bc命令

基本语法:

result=$(echo "scale=N; expression" | bc)

其中N表示十进制小数位数。

示例:

 r1=$(echo "scale=4; 1 / 3" | bc)     # .3333
 pi=3.14159
 r2=$(echo "scale=5; $pi - $r1" | bc) # 2.80829

awk命令

基本语法:

result=$(awk "BEGIN { printf(\"%.Nf\", expression) }")

其中N为十进制小数位数。

r1=$(awk "BEGIN { printf(\"%.4f\", 1 / 3) }")  # 0.3333
pi=3.14159
r2=$(awk "BEGIN { printf(\"%.5f\", $pi - $r1) }")  # 2.80829

printf指定浮点数输出格式

当需要对浮点数进行舍入输出时,可以使用printf命令配合bcawk命令。其用法与C语言中的printf很相似。

参考资料

  1. http://blog.sina.com.cn/s/blog_674b5aae0100o2mn.html
  2. https://tecadmin.net/bash-floating-point-math-calculations/
shellbash
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

MetMan's Blog

本文链接:

https://blog.metman.top/index.php/archives/81/(转载时请注明本文出处及文章链接)

评论 (0)

互动读者

标签云

最新回复

暂无回复

登录
X
用户名
密码