Linux基础之 Shell 运算符

同其他任何编程语言一样,shell 支持多种类型的运算符:

算术赋值运算符

符号 意义
+ 加法
- 减法
* 乘法
/ 除法
% 取余
** 乘方
++ 自增,有前增和后增之分
-- 自减,有前减和后减之分
+= -= *= /= %= 加等,减等,乘等,模等,余等

不同的是,shell 中的算术运算不能直接执行,需要特定的表达式进行封装,常见的有exprbc$(())$[];实践中经常用到的是后两种,举例如下:

$ 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 或, 仅[] 表达式支持
&& 短路与,左边为假便不再执行, 仅[[]] 表达式支持
|| 短路或,左边为真便不再执行, 仅[[]] 表达式支持
!

你可能感兴趣的:(Linux基础之 Shell 运算符)