Shell 基本运算符

条件运算符

Tutorial: Conditions in bash scripting

数学运算

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

1
2
3
4
5
val=`expr 1 + 2`
n1=1
n2=2
echo `expr $n1 + $n2`

注意:

  • 表达式和运算符之间要有空格,例如 1+2 是不对的,必须写成 1 + 2
  • 完整的表达式要被 ` ` 包含。

另外,使用 $(()) 可对表达式进行简单计算

1
echo $((5+4)) #返回9

另外,还可使用 let 命令

算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

  • + 加法 expr $a + $b 结果为 30。
  • - 减法 expr $a - $b 结果为 10。
  • * 乘法 expr $a \* $b 结果为 200。
  • / 除法 expr $b / $a 结果为 2。
  • % 取余 expr $b % $a 结果为 0。
  • = 赋值 a=$b 将把变量 b 的值赋给 a。
  • == 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
  • != 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

注意:

  • 乘号 * 前边必须加反斜杠 \才能实现乘法运算;
  • 条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

使用 [] 注意:[] 与操作符之间要有空格,使用变量需使用 $

  • -eq 检测两个数是否相等; [ $a -eq $b ] 返回 false。
  • -ne 检测两个数是否相等; [ $a -ne $b ] 返回 true。
  • -gt 检测左边的数是否大于右边的;[ $a -gt $b ] 返回 false。
  • -lt 检测左边的数是否小于右边的;[ $a -lt $b ] 返回 true。
  • -ge 检测左边的数是否大等于右边的;[ $a -ge $b ] 返回 false。
  • -le 检测左边的数是否小于等于右边的;[ $a -le $b ] 返回 true。
  • ==!= 也是可用的

使用 (()) 注意:(()) 与操作符之间可以没有空格,使用变量可以不使用 $

  • == 等于,如:(( a == b ))
  • != 不等于,如:(( a != b ))
  • < 小于,如:(( a < b ))
  • <= 小于等于,如:(( a <= b ))
  • > 大于,如:(( a > b ))
  • >= 大于等于,如:(( a >= b ))

布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

  • ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
  • -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
  • -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。

逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

  • && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]][ $a -lt 100 ] && [ $b -gt 100 ] 返回 false
    • 注意与布尔运算符 -a 的区别:需要使用双 [[]]
    • 推荐使用 [ $a -lt 100 ] && [ $b -gt 100 ],因为结构更清晰
  • || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]][ $a -lt 100 ] || [ $b -gt 100 ] 返回 true
    • 注意与布尔运算符 -o 的区别:需要使用双 [[]]

字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

  • =、或 == 检测两个字符串是否相等,[ $a = $b ] 返回 false
  • != 检测两个字符串是否不相等,[ $a != $b ] 返回 true
  • -z 检测字符串长度是否为0,[ -z $a ] 返回 false
  • -n 检测字符串长度是否不为0,[ -n $a ] 返回 true
  • str 检测字符串是否不为空,[ $a ] 返回 true

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。常见属性检测描述如下:

  • -d file 检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
  • -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
  • -r file 检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
  • -w file 检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
  • -x file 检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
  • -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
  • -e file 检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。