除了 Shell 本身的算数运算表达式,还有几个命令支持复杂的算数运算:

命令描述示例
let赋值并运算,支持++、--let VAR=(1+2)*3 ; echo $VAR x=10 ; y=5
let x++;echo $x 每执行一次x 加 1 let y--;echo $y 每执行一次y 减 1 let x+=2 每执行一次x 加 2
let x-=2 每执行一次x 减 2
expr乘法需要加反斜杠转义\expr 1 \* 2 运算符两边必须有空格
expr \( 1 + 2 \) \* 2 使用双括号时要转义
bc计算器,支持浮点运算、平方等bc 本身就是一个计算器,可直接输入命令,进入解释器。echo 1 + 2 |bc 将管道符前面标准输出作为 bc 的标准输入echo "1.2+2" |bc
echo "10^10" |bc
echo 'scale=2;10/3' |bc 用 scale 保留两位小数点

由于 Shell 不支持浮点数比较,可以借助bc 来完成需求:

# echo "1.2 < 2" |bc
1
# echo "1.2 > 2" |bc
0
# echo "1.2 == 2.2" |bc
0
# echo "1.2 != 2.2" |bc
1


看出规律了嘛?运算如果为真返回 1,否则返回 0,写一个例子: 
# [ $(echo "2.2 > 2" |bc) -eq 1 ] && echo yes || echo no 
yes
# [ $(echo "2.2 < 2" |bc) -eq 1 ] && echo yes || echo no 
no

expr 还可以对字符串操作:

获取字符串长度:
# expr length "string" 
6


截取字符串:
# expr substr "string" 4 6 
ing


获取字符在字符串中出现的位置: 
# expr index "string" str
1
# expr index "string" i 
4


获取字符串开始字符出现的长度: 
# expr match "string" s.*
6
# expr match "string" str 
3