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:检测文件是否存在并且是一个符号连接