Shell算术运算
01/11
本文最后更新于
2024年01月11日,已超过
415天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
本文介绍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
命令配合bc
或awk
命令。其用法与C语言中的printf很相似。
参考资料

