shell运算符
目录
Shell 和其他编程语言一样,支持多种运算符:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
1、算术运算符
下表列出了常用的算术运算符,假定变量 a
为 1
,变量 b
为 2
:
运算符 | 说明 | 举例 |
---|---|---|
+ |
加法 | expr $a + $b 结果为 3 |
- |
减法 | expr $a - $b 结果为 -1 |
* |
乘法 | expr $a \* $b 结果为 2 |
/ |
除法 | expr $b / $a 结果为 2 |
% |
取余 | expr $b % $a 结果为 0 |
= |
赋值 | a=$b 将把变量 b 的值赋给 a |
== |
相等。用于比较两个数字是否相同 | [ $a == $b ] 返回 false |
!= |
不相等。用于比较两个数字是否不相同 | [ $a != $b ] 返回 true |
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b]
是错误的,必须写成 [ $a == $b ]
。
|
|
执行脚本,输出结果如下所示:
|
|
注意:乘号*
前边必须加反斜杠\
才能实现乘法运算
2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 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 |
3、布尔运算符
下表列出了常用的布尔运算符,
假定变量 a
为 10
,变量 b
为 20
:
运算符 | 说明 | 举例 |
---|---|---|
! |
非运算 | [ ! false ] 返回 true |
-o |
或运算 | [ $a -lt 20 -o $b -gt 100 ] 返回 true |
-a |
与运算 | [ $a -lt 20 -a $b -gt 100 ] 返回 false |
4、逻辑运算符
以下介绍 Shell 的逻辑运算符,
假定变量 a
为 10
,变量 b
为 20
:
运算符 | 说明 | 举例 |
---|---|---|
&& |
逻辑的 AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| |
逻辑的 OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回 true |
5、字符串运算符
下表列出了常用的字符串运算符,
假定变量 a
为 "abc"
,变量 b
为 "efg"
:
运算符 | 说明 | 举例 |
---|---|---|
= |
检测两个字符串是否相等 | [ $a = $b ] 返回 false |
!= |
检测两个字符串是否相等 | [ $a != $b ] 返回 true |
-z |
检测字符串长度是否为0 ,为0 返回 true |
[ -z $a ] 返回 false |
-n |
检测字符串长度是否不为 0 ,不为 0 返回 true |
[ -n "$a" ] 返回 true |
$ |
检测字符串是否为空,不为空返回 true |
[ $a ] 返回 true |
6、文件测试运算符
文件测试运算符用于检测 Unix
文件的各种属性。
属性检测描述如下(file="/test.sh"
是一个普通文件):
操作符 | 说明 | 举例 |
---|---|---|
-b file |
检测文件是否是块设备文件 | [ -b $file ] 返回 false |
-c file |
检测文件是否是字符设备文件 | [ -c $file ] 返回 false |
-d file |
检测文件是否是目录 | [ -d $file ] 返回 false |
-f file |
检测文件是否是普通文件(既不是目录,也不是设备文件) | [ -f $file ] 返回 true |
-g file |
检测文件是否设置了 SGID 位 |
[ -g $file ] 返回false |
-k file |
检测文件是否设置了粘着位(Sticky Bit ) |
[ -k $file ] 返回false |
-p file |
检测文件是否是有名管道 | [ -p $file ] 返回 false |
-u file |
检测文件是否设置了 SUID 位 |
[ -u $file ] 返回 false |
-r file |
检测文件是否可读 | [ -r $file ] 返回 true |
-w file |
检测文件是否可写 | [ -w $file ] 返回 true |
-x file |
检测文件是否可执行 | [ -x $file ] 返回 true |
-s file |
检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true |
-e file |
检测文件(包括目录)是否存在 | [ -e $file ] 返回 true |
其他检查符:
-S
: 判断某文件是否socket
-L
: 检测文件是否存在并且是一个符号链接