同其他任何编程语言一样,shell 支持多种类型的运算符:
算术赋值运算符
符号 | 意义 |
---|---|
+ |
加法 |
- |
减法 |
* |
乘法 |
/ |
除法 |
% |
取余 |
** |
乘方 |
++ |
自增,有前增和后增之分 |
-- |
自减,有前减和后减之分 |
+= -= *= /= %=
|
加等,减等,乘等,模等,余等 |
不同的是,shell 中的算术运算不能直接执行,需要特定的表达式进行封装,常见的有expr
,bc
,$(())
,$[]
;实践中经常用到的是后两种,举例如下:
$ echo $[2 + 2] $((2 + 2))
4 4
$ echo $[3 - 2] $((3 - 2))
1 1
$ echo $[3 * 2] $((3 * 2))
6 6
$ echo $[3 / 2] $((3 / 2))
1 1
$ echo $[3 % 2] $((3 % 2))
1 1
$ echo $[3 ** 2] $((3 ** 2))
9 9
$ i=4
$ echo $[i++] $((i--))
4 5
$ echo $[++i] $((--i))
5 4
$ i=2
$ echo $[i+=3]
5
$ echo $((i-=3))
2
$ echo $((i*=3))
6
$ echo $[i/=3]
2
$ echo $[i%=3]
2
位运算符
符号 | 意义 |
---|---|
>> |
右移 |
<< |
左移 |
& |
与 |
| |
或 |
~ |
非 |
^ |
异或 |
同样,使用$[]
和 $(())
演示如下
$ echo $((3>>1)) $[3>>1]
1 1
$ echo $((3<<1)) $[3<<1]
6 6
$ echo $((3&1)) $[3&1]
1 1
$ echo $((3|1)) $[3|1]
3 3
$ echo $((~3)) $[~3]
-4 -4
$ echo $((3^1)) $[3^1]
2 2
- 备注:求非运算涉及到二进制反码和补码的概念,在计算机中,运算都是以补码形式进行的,而显示则用原码,简单来说,结果是
-(a+1)
比较运算符
这里指的是数字之间的大小比较,结果为true
或者 false
,同样需要表达式来进行封装,封装格式有test
, []
和 [[]]
,常用的是后两者。在[]
表达式中,常见的>
,<
需要加转义字符,[[]]
作为[]
的补充,此处不需要转义。
符号 | 意义 |
---|---|
= | 等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
-eq | 等于 |
-ne | 不等于 |
-lt | 小于 |
-gt | 大于 |
-le | 小于或等于 |
-ge | 大于或等于 |
- 备注:与其他编程语言不同的是,shell 不支持
>=
和<=
这两种比较运算符
字符串判断运算符
与比较运算符相似,常用[]
和 [[]]
表达式进行封装才能实现具体功能
符号 | 意义 |
---|---|
= | 等于 |
!= | 不等于 |
-z | 长度为0 |
-n | 长度不为0 |
$ | 是否为空 |
== | 以通配符进行模式匹配,不应该加"" ,仅 [[]] 表达式支持 |
=~ | 以扩展正则表达式进行模式匹配,不应该加"" , 仅 [[]] 表达式支持 |
$ a='abc'
$ b='def'
$ [[ a != b ]] && echo 'ko'
ko
$ [ -n a ] && echo 'ok'
ok
$ [ -z a ] || echo 'ok'
ok
$ [[ a = b ]] || echo 'ko'
ko
$ [ $a ] && echo 'ok'
ok
$ [[ $a == ??? ]] && echo 'ok'
ok
$ [[ $a =~ a.* ]] && echo 'ok'
ok
文件测试运算符
同样需要表达式封装
操作符 | 说明 |
---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true |
-d file | 检测文件是否是目录,如果是,则返回 true |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true |
-p file | 检测文件是否是具名管道,如果是,则返回 true |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true |
-r file | 检测文件是否可读,如果是,则返回 true |
-w file | 检测文件是否可写,如果是,则返回 true |
-x file | 检测文件是否可执行,如果是,则返回 true |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true |
逻辑运算符
同上,需要表达式封装
符号 | 意义 |
---|---|
-a |
与, 仅[] 表达式支持 |
-o |
或, 仅[] 表达式支持 |
&& |
短路与,左边为假便不再执行, 仅[[]] 表达式支持 |
|| |
短路或,左边为真便不再执行, 仅[[]] 表达式支持 |
! |
非 |