Shell 数学运算

整型运算

shell 中算术运算只支持整数型。小数部分会舍弃。

算术运算符

支持运算符:

  • ++=
  • --=
  • **=
  • //=
  • %%=,取余,比如:10%3=1
  • **,幂运算,比如:2**3=8
  • ++
  • --

位运算符

  • <<<<= :左移
  • >>>>= :右移
  • &&= :与运算
  • ||= :或运算
  • ^^= :异或
  • ~= :非

let

数字运算使用 let 命令运算:

v1=1+1
# 结果:1+1
let "v2=1+1"
# 结果:2

let "v3=8|4"

let "i = 1 + 1"

$(( ))

 echo $((1+1))
 # 结果:2
 echo $((2**3))
 # 结果:8

let 语句和 $(( )) 语法的另一处重要区别在于两者处理空白字符(空格字符)的方式不同。

对 let 语句来说,要么添加引号,要么赋值运算符(=)和其他运算符两边不能出现空格。必须将运算符和操作数放在一起形成一个单词。以下两种写法都没问题。

let i=1+1
let "i = 1 + 1"

$(( )) 语法就宽松多了,它允许各种空白字符出现在双括号内。这种写法不易出错,代码的可读性也要好得多,是我们执行 bash 整数运算时的首选方式。

$[ ]

 echo $[1+1]
 # 结果:2
 echo $[2**3]
 # 结果:8

expr

expr 要求数字和运算符之间有空格

expr 1 + 1
# 打印结果:2

declare -i

声明int类型的变量

declare -i i
i=$i+1
# i=2

浮点型运行

上面的运算只支持整型,浮点运行可以使用bc命令。

交互式:

$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1.1 * 3
3.3
1*5
5
a=2
b=3
a/b
0
# 设置小数位数
scale=5
a/b
.66666

# 逻辑运算
1>2
0
2==2
1
1>2&&2==2
0
1>2||2==2
1

命令式:

echo "1+1"|bc
# 结果:2

逻辑运算

  • &&:与
  • ||:或
  • ! :非

比如:[ -e x.sh ] && [ -e z.zip ],判断 两个文件都存在。

逻辑测试运算

  • -a:与
  • -o:或
  • ! :非

比如:[ -e x.sh -a -e z.zip ],判断 两个文件都存在。