备注:正如下文所示,一些帮助处理数字的命令在某些方便表现仍不够完善,例如运算符周围的空格。
declare
在 Shell 中你无需提前声明变量,但如果你提前声明一个整型变量,那么以下示例将展示整型变量是如何工作的:
创新互联-专业网站定制、快速模板网站建设、高性价比博州网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式博州网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖博州地区。费用合理售后完善,十年实体公司更值得信赖。$ n=6/3
$echo $n
6/3
$ declare-i n
$ n=6/3
$echo $n
2
如果你决定使用一个已有的程序或者内置命令来处理算术,那么你完全可以不用 declare 语句。
exprexpr 是一个比较老的 Unix 程序可以用来算术求值。expr 在 Bourne Shell 时期开始广为人知,因为 Bourne Shell 不支持算术。但在 Bash 和 Korn Shell 中,一般不再使用它。使用 expr 时,仍然是把变量当作一个字符串来处理,并且它对空格处理也不够灵活,要求在表达式中使用空格分隔变量。
$ z=5
$ z=`expr $z+1` ---- Need spaces around + sign.
$echo $z
5+1
$ z=`expr $z + 1`
$echo $z
6
let
Bash 和 Korn Shell 内置处理算术的命令是 let。它对空格处理也有点不灵活,和 expr 相反,它要求变量之间不能使用空格。
$ let z=5
$echo $z
5
$ let z=$z+1
$echo $z
6
$ let z=$z + 1 # --- Spaces around + sign are bad with let
-bash: let: +: syntax error: operand expected (error token is "+")
$let z=z+1 # --- look Mom, no $ to read a variable.
$echo $z
7
如果不想为空格烦扰,那么请使用双括号来包裹整个语句,这样有无空格都可以顺利求值。
$ ((e=5))
$echo $e
5
$ (( e= e + 3 ))
$echo $e
8
$ (( e=e+4 )) # -- spaces or no spaces, it doesn't matter$ echo $e
12
bc
如果要处理浮点数字或者更复杂一点的运算怎么办?let 命令不能支持浮点数字,因此需要使用 bc 命令,但是你必须将整个运算表达式当作一个字符串来交给 bc 处理。
如果你使用 let 命令处理浮点会得到以下错误示例:
$let r=3.5-bash: let: r=3.5: syntax error in expression (error token is ".5")
$(( r= 3.5 ))
-bash: ((: r = 3.5 : syntax error in expression (error token is ".5")
bc 命令可以处理任意精度的数学运算。bc 有交互模式和 shell 脚本命令两种模式。在交互模式下,使用 cntrl-d(EOF) 或者 quit 指令退出。
交互模式:
$ bc
bc1.06
Copyright1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This isfree software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.3 + 25
obase=2121100
脚本模式:
$r=3.5
$s=`echo "$r + 2.2" | bc`
$echo $s
5.7
$ z= `echo $z + 1 | bc`
-bash: z: command not found
#-- spaces around = sign are bad
(shell thing, not bc)
$ z=`echo "$z + 1" | bc`
$echo $z
8
$ z=`echo "$z+1" | bc` -- spaces don't matter with bc$ echo $z
9
数字布尔值表达式
INTEGER1 -eq INTEGER2 : INTEGER1 等于 INTEGER2
INTEGER1 -ge INTEGER2 : INTEGER1 大于或等于 INTEGER2
INTEGER1 -gt INTEGER2 : INTEGER1 大于 INTEGER2
INTEGER1 -le INTEGER2 : INTEGER1 小于或等于 INTEGER2
INTEGER1 -lt INTEGER2 : INTEGER1 小于 INTEGER2
INTEGER1 -ne INTEGER2 : INTEGER1 不等于 INTEGER2
以下两个 if 语句是等效的:
if (( x < y )); then
statements
fiif [ $x -lt $y ]; then
statements
fi
对于浮点算术,bc 返回 1 表示真,0 表示假:
if [ $( echo "$t < 3.4" | bc ) -eq 1 ]; then
statements
fi
参考一