Shell:运算符¶
算数运算符¶
运算符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 |
== | 相等。用于比较两个数字,相同则返回 true。 |
= | 赋值 |
% | 取余 |
/ | 除法 |
* | 乘法 |
原生 bash 不支持数学运算,但可以通过其他命令来实现:
- let
- []
- (())
- expr
- awk
- bc
Reference
expr 需要注意以下三点:
- 除赋值外,其余 运算符和参数之间 需要有空格
- 完整的表达式要被反引号
包含,注意这个字符不是常用的单引号,在 Esc 键下方
- 乘法运行算符*需要转义使用:
\*
关系运算符¶
运算符 | 说明 |
---|---|
-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:检测文件是否存在并且是一个符号连接