SHELL下的数字比较及计算

比较:

方法一: if [ ${A} -lt ${B} ]; then …

这是最基本的比较方法,使用lt(小于),gt(大于),le(小于等于),ge(大于等于),优点:还没发现;缺点:只能比较整数,使用lt,gt等不直观
 

方法二: if ((${A} < ${B})) then …

这是CShell风格比较,优点:不用使用lt,gt等难记的字符串;缺点:还是只能比较整数

 

方法三: if (echo ${A} ${B} | awk ‘!($1>$2){exit 1}’) then …

这是使用awk比较,优点:可以比较小数;缺点:表达式太复杂,难记
 

方法四: if (echo ${A} – ${B} | bc -q | grep -q “^-”); then …

这是使用bc计算比较,优点:可以比较小数;缺点:表达式更复杂,难记
 

计算:

方法一:typeset C=$(expr ${A} + ${B});

SHELL中的基本工具,优点:方便检测变量是否为数字;缺点:只能计算整数,且只能计算加减法,不能计算乘除法
 

方法二:let “C=${A}+${B}”; 或 let “C=A+B”

内嵌命令计算,优点:能计算乘除法及位运算等;缺点:只能计算整数
 

方法三:typeset C=$((A+B))

CShell风格的计算,优点:能计算乘除法及位运算等,简介,编写方便;缺点:不能计算小数
 

方法四:typeset C=${echo ${A} ${B} | awk ‘{print $1+$2}’)

使用awk计算,优点:能计算小数,可以实现多种计算方式,计算灵活;缺点:表达式太复杂
 

方法五:typeset C=${echo ${A} + ${B} | bc -q)

使用awk计算,优点:能计算小数,计算方式比awk还多,计算灵活;缺点:表达式太复杂,小数点后面的位数必须使用scale=N来设置,否则可能会将结果截断为整数

【以上是转帖,正确性未经验证】

 

【以下是自己亲自验证过的】

(1)除法运算
经过验证可行的除法运算①(含小数):

RESULT=`echo "scale=1; $A/$B" | bc`

表示变量A除以变量B,结果保留1位小数,最终结果保存在RESULT中。如果系统中没有安装“bc”程序,这条命令就行不通了,那么就可以使用下面的命令。

文章来源:http://www.codelast.com/

经过验证可行的除法运算②(含小数):

RESULT=`awk 'BEGIN{printf "%.1f", '$A'/'$B'}'`

实现的效果与上面的那条命令完全相同。

(2)两个小数的大小比较
不能用 gt,lt 等来判断,因为它们只支持整数。小数的大小比较可以用下面的方法:

expr $A \> $B

返回1表示A>B, 返回0表示A<B。

发表评论