跳转至

Shell:运算符

算数运算符

运算符 说明
+ 加法
- 减法
!= 不相等。用于比较两个数字,不相同则返回 true。
== 相等。用于比较两个数字,相同则返回 true。
= 赋值
% 取余
/ 除法
* 乘法

原生 bash 不支持数学运算,但可以通过其他命令来实现:

  • let
  • []
  • (())
  • expr
  • awk
  • bc

expr 需要注意以下三点:

  • 除赋值外,其余 运算符和参数之间 需要有空格
  • 完整的表达式要被反引号    包含,注意这个字符不是常用的单引号,在 Esc 键下方
  • 乘法运行算符*需要转义使用: \*
x=20
y=10

val=`expr ${x} + ${y}`
val=`expr ${x} \* ${y}` ## 乘法运算符*需要转义才能使用

关系运算符

运算符 说明
-eq 检测两个数是否相等,相等返回 true。等于算数运算符: ==
-ne 检测两个数是否相等,不相等返回 true。等于算数运算符: !=
-le less than or equal 检测左边的数是否 ≤ 小于等于右边的,如果是,则返回 true。
-ge greater than or equal 检测左边的数是否 ≥ 大于等于右边的,如果是,则返回 true。
-lt less than 检测左边的数是否 < 小于右边的,如果是,则返回 true。
-gt greater than 检测左边的数是否 > 大于右边的,如果是,则返回 true。

运算符和参数之间 需要有空格!

使用 [[]]条件判断结构,而不是 [],能够防止脚本中的许多逻辑错误。

比如, &&、||、<和> 操作符能够正常存在于 [[]] 条件判断结构中,但是如果出现在 [] 结构中的话,会出现问题:

  • 当使用[] 来操作 &&、||时,需要将其放在两个 [] 之间: [ expr1 ] && [ expr ] ,但是使用 [[]] 来操作时,可以直接使用: [[ expr1 && expr2 ]]
  • [[]] 不可以使用 -o、-a 运算符,而 [] 可以直接使用 -o、-a 代替 &&、|| ,例如: [ expr -a expr ]
  • 不可以使用 [] 来操作 <、>,需要使用 -lt、-gt 来代替。 注意: -le、-ge 这两个运算符 无法 使用 <=、>= 代替!
  • [] 中, -eq、-ne 可以用 =、!= 来代替。
## 以下三种用法实现的功能相同!
if [[ $a != 1 && $b != 2 ]]
if [ $a -ne 1] && [ $a != 2 ]
if [ $a -ne 1 -a $a != 2 ]

逻辑运算符

运算符 说明
! 非运算,表达式为 true 则返回 false,否则返回 true。
-o 或运算,有一个表达式为 true 则返回 true。
|| 或运算,可以短路运算,[[]]可用
-a 与运算,两个表达式都为 true 才返回 true。
&& 与运算,可以短路运算,[[]]可用

字符串运算符

运算符 说明
= 检测两个字符串是否相等,相等返回 true。
!= 检测两个字符串是否不相等,不相等返回 true。
$ 检测字符串是否为空,不为空返回 true。
-n 检测字符串长度是否不为 0,不为 0 返回 true。
-z 检测字符串长度是否为 0,为 0 返回 true。

$-n-z 是三个 单目运算符

if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi

if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi

if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性:

属性检测描述如下:

操作符 说明
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于 0),不为空返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-p file 检测文件是否是有名管道,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。

其他检查符:

  • -S:判断某文件是否 socket
  • -L:检测文件是否存在并且是一个符号连接