Linux 之 Shell 算术运算符
Linux Shell 加减乘除运算
((i=$j+$k))
((i=$j-$k))
((i=$j*$k))
((i=$j/$k))
Let expressions
格式:let “I = I + 1” 或 let i=i+1
示例:
root@ubuntu:# i=3
root@ubuntu:# let i=i+1
root@ubuntu:# echo $i
4
root@ubuntu:# let "i = i + 1"
root@ubuntu:# echo $i
5
算术运算符
Shell中常用的数学运算符,指的是可以在程序中实现加、减、乘、除等数学运算的运算符。
+:对两个变量做加法。
-:对两个变量做减法。
*:对两个变量做乘法。
/:对两个变量做除法。
**:对两个变量做幂运算。
%:取模运算,第一个变量除以第二个变量求余数。
+=:加等于,在自身基础上加第二个变量。
-=:减等于,在第一个变量的基础上减去第二个变量。
*=:乘等于,在第一个变量的基础上乘以第二个变量。
/=:除等于,在第一个变量的基础上除以第二个变量。
%=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量。
在使用这些运算符时,需要注意到运算顺序的问题。例如输入下面的命令,输出1+2的结果。
echo 1+2
Shell并没有输出结果3,而是输出了1+2。在shell中有三种方法可以更改运算顺序。
方法1: 用expr改变运算顺序
可以用echo `expr 1 +2`来输出1+2的结果,用expr表示后面的表达式为一个数学运算。需要注意的是,`并不是一个单引号,而是“Tab”键上面的那个符号。
方法2: 用let指示数学运算(没成功)
可以先将运算的结果赋值给变量b,运算命令是b=let 1 + 2。然后用echo $b来输出b的值。如果没有let,则会输出1+2。
方法3: 用$[]表示数学运算
将一个数学运算写到$[]符号的中括号中,中括号中的内容将先进行数学运算。例如命令echo $[1+2],将输出结果3,又如命令 echo $[2 * 4] 将输出 8
下面是一个shell程序实例,实现数学函数S=3(xy)+4x2+5y+6的运算。在程序中以位置变量的方式输入x与y的值。程序的编写步骤如下所示。
数学运算实例:cal_num.sh
#!/bin/bash
#cal_num.sh
# Copyright by mimvp.com
s=0
t=`expr$1**$2`
t=$[t*3]
s=$[s+t]
t=$[$1**2]
t=$[t*4]
s=$[s+t]
t=`expr$2*5`
s=$[s+t]
s=$[s+6]
echo$s
echo$((a%b))
chmod +x 4.4.sh
./4.4.sh 2 4
90
shell 除法技巧
shell计算中使用除法,基本默认上都是整除。比如:
num1=2
num2=3
num3=`expr $num1 / $num2`
这个时候num3=0 , 因为是因为expr不支持浮点除法
解决的方法1:
num3=`echo "sclae=2; $num1/$num2" | bc`
使用bc工具,sclae控制小数点后保留几位
解决的方法2:
awk 'BEGIN{printf "%.2f\n",’$num1‘/’$num2‘}'
如果用百分比表示
awk 'BEGIN{printf "%.2f%\n",(’$num1‘/’$num2‘)*100}'
shell 乘除运算
示例:
#!/bin/bash # mimvp.com # 2015-02-06 log='youku_monitor_disk.log' MB=`expr 1024 \* 1024` GB=`expr 1024 \* 1024 \* 1024` dtime=$(date "+%Y-%m-%d__%H:%M:%S") echo "========= $dtime =========" df -m echo "" disk_total_MB=`df -hm | grep data1 | awk '{print $2}'` disk_used_MB=`df -hm | grep data1 | awk '{print $3}'` disk_used_GB=`expr $disk_used_MB / 1024` disk_used_TB=`expr $disk_used_GB / 1024` disk_used_GB_2=`echo "scale=2; $disk_used_MB / 1024" | bc` disk_used_TB_2=`echo "scale=2; $disk_used_GB / 1024" | bc` disk_used_GB_3=`awk 'BEGIN{printf "%.2f", '$disk_used_MB' / 1024}'` disk_used_TB_3=`awk 'BEGIN{printf "%.2f", '$disk_used_GB' / 1024}'` disk_used_ratio=`awk 'BEGIN {printf "%.2f%", '$disk_used_MB' / '$disk_total_MB' * 100}'` echo "MB : $MB" echo "GB : $GB" echo "disk_total_MB : $disk_total_MB" echo "disk_used_MB : $disk_used_MB" echo "disk_used_ratio : $disk_used_ratio" echo "disk_used_GB : $disk_used_GB" echo "disk_used_TB : $disk_used_TB" echo "disk_used_GB_2 : $disk_used_GB_2" echo "disk_used_TB_2 : $disk_used_TB_2" echo "disk_used_GB_3 : $disk_used_GB_3" echo "disk_used_TB_3 : $disk_used_TB_3"
运行结果:
========= 2015-02-06__10:55:15 =========
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/sda2 30238 11819 16884 42% /
tmpfs 7950 0 7950 0% /dev/shm
/dev/sda1 1008 56 902 6% /boot
/dev/sda5 233713 3406 218436 2% /data
/dev/sdb 31469578 19693445 11776134 63% /data1
MB : 1048576
GB : 1073741824
disk_total_MB : 31469578
disk_used_MB : 19693445
disk_used_ratio : 62.58%
disk_used_GB : 19231
disk_used_TB : 18
disk_used_GB_2 : 19231.87
disk_used_TB_2 : 18.78
disk_used_GB_3 : 19231.88
disk_used_TB_3 : 18.78
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2019-01-30 11:07:37
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!