expr命令

expr命令允许在命令行上处理数学表达式,但是特别笨拙。

许多expr命令操作符在shell中另有含义(比如星号)。当它们出现在在expr命令中时,会得到一些诡异的结果。

$ expr 5 * 2
expr: syntax error

要解决这个问题,对于那些容易被shell错误解释的字符,在它们传入expr命令之前,需要使用shell的转义字符(反斜线)将其标出来。

要将一个数学算式的结果赋给一个变量,需要使用命令替换来获取expr命令的输出.

幸好bash shell有一个针对处理数学运算符的改进.

使用方括号

bash shell为了保持跟Bourne shell的兼容而包含了expr命令,但它同样也提供了一种更简单的方法来执行数学表达式。在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和 方括号($[ operation ])将数学表达式围起来。

用方括号执行shell数学运算比用expr命令方便很多。这种技术也适用于shell脚本。

var4=$[$var1 * ($var2 - $var3)]

bash shell数学运算符只支持整数运算。若要进行任何实际的数学计算,这是一个巨大的限制。

let

let命令可以直接执行基本的算数操作。

当使用let时,变量名之前不需要再添加$,例如:

let result=no1+no2
echo $result

自加操作

$ let no1++

自减操作

$ let no1--

简写形式

let no+=6
let no-=6

它们分别等同于let no=no+6和let no=no-6。

bash计算器bc

bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该 表达式,最后返回结果。bash计算器能够识别:

  1. 数字(整数和浮点数)
  2. 变量(简单变量和数组)
  3. 注释(以#或C语言中的/* */开始的行)
  4. 表达式
  5. 编程语句(例如if-then语句)
  6. 函数

可以在shell提示符下通过bc命令访问bash计算器,要退出bash计算器,你必须输入quit。

浮点运算是由内建变量scale控制的。必须将这个值设置为你希望在计算结果中保留的小数 位数,否则无法得到期望的结果。

scale变量的默认值是0。在scale值被设置前,bash计算器的计算结果不包含小数位。在将其值设置成4后,bash计算器显示的结果包含四位小数。

-q命令行选项可以不显示bash计算器冗长的欢迎信息。

除了普通数字,bash计算器还能支持变量。

$ bc -q
var1=10
var1 * 4
40
var2 = var1 / 5
print var2
2
quit
$

变量一旦被定义,你就可以在整个bash计算器会话中使用该变量了。print语句允许你打印变量和数字。

可以用命令替换运行bc命令,并将输出赋给一个变量。基本格式如下:

variable=$(echo "options; expression" | bc) 

第一部分options允许你设置变量。如果你需要不止一个变量,可以用分号将其分开。expression参数定义了通过bc执行的数学表达式。

也可以用shell脚本中定义好的变量。在bash 计算器中创建的变量只在bash计算器中有效,不能在shell脚本中使用。

$ cat test10
#!/bin/bash
var1=100
var2=45
var3=$(echo "scale=4; $var1 / $var2" | bc)
echo The answer for this is $var3
$

这个方法适用于较短的运算,但有时你会涉及更多的数字。如果需要进行大量运算,在一个 命令行中列出多个表达式就会有点麻烦。

最好的办法是使用内联输入重定向,它允许你直接在命令行中重定向数据。在shell脚本中, 你可以将输出赋给一个变量。

variable=$(bc << EOF
options
statements
expressions
EOF )

EOF文本字符串标识了内联重定向数据的起止。记住,仍然需要命令替换符号将bc命令的输 出赋给变量。