见菜鸟教程:http://www.runoob.com/linux/linux-shell-basic-operators.html
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
#!/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val"
执行脚本,输出结果如下所示:
两数之和为 : 4
两点注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
算术运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | `expr $a + $b` 结果为30。 |
- | 减法 | `expr $a - $b` 结果为 -10。 |
乘法 | `expr $a \* $b` 结果为 200。 | |
除法 | `expr $b / $a` 结果为2。 | |
取余 | `expr $b % $a` 结果为0。 | |
赋值 | a=$b 将把变量 b 的值赋给 a。 | |
相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回false。 | |
不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
注意:条件表达式要放在方括号之间,并且要有空格,例如:[$a==$b]是错误的,必须写成[ $a == $b ]。
实例
算术运算符实例如下:
if 语法的结束语句为:fi,每个if 都要带上fi。
# author:菜鸟教程# url:www.runoob.com a=10 b20`expr $a + $b`"a + b : $val"`expr $a - $b`"a - b : $val"`expr $a \* $b`"a * b : $val"`expr $b / $a`"b / a : $val"`expr $b % $a`"b % a : $val" if[ $a == $b ] then echo "a 等于 b"fi!="a 不等于 b"fi
a + b 30 a --*200 b / a 2%0不等于 b
注意:
- 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
- if...then...fi 是条件语句,后续将会讲解。
- 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。
关系运算符
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回false。 |
检测两个数是否相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
关系运算符实例如下:
eq $b "$a -eq $b : a 等于 b"else"$a -eq $b: a 不等于 b"ne $b "$a -ne $b: a 不等于 b""$a -ne $b : a 等于 b"gt $b "$a -gt $b: a 大于 b""$a -gt $b: a 不大于 b"lt $b "$a -lt $b: a 小于 b""$a -lt $b: a 不小于 b"ge $b "$a -ge $b: a 大于或等于 b""$a -ge $b: a 小于 b"le $b "$a -le $b: a 小于或等于 b""$a -le $b: a 大于 b"eq 20 b
ne gt 不大于lt 小于ge le 小于或等于 b
布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回true。 |
与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回false。 |
布尔运算符实例如下:
"$a != $b : a 不等于 b""$a != $b: a 等于 b"100a $b 15"$a 小于 100 且 $b 大于 15 : 返回 true""$a 小于 100 且 $b 大于 15 : 返回 false"o $b "$a 小于 100 或 $b 大于 100 : 返回 true""$a 小于 100 或 $b 大于 100 : 返回 false"5"$a 小于 5 或 $b 大于 100 : 返回 true""$a 小于 5 或 $b 大于 100 : 返回 false"且大于返回 true
或false
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
逻辑运算符实例如下:
[[&&]]"返回 true""返回 false"||false
true
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
[ $a = $b ] 返回 false。 | |
[ $a != $b ] 返回true。 | |
检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
检测字符串长度是否为0,不为0返回 true。 | [ -n $a ] 返回 true。 |
检测字符串是否为空,不为空返回 true。 | [ $a ] 返回true。 |
字符串运算符实例如下:
"abc""efg"="$a = $b : a 等于 b""$a = $b: a 不等于 b"z $a "-z $a : 字符串长度为 0""-z $a : 字符串长度不为 0"n $a "-n $a : 字符串长度不为 0""-n $a : 字符串长度为 0""$a : 字符串不为空""$a : 字符串为空"abc efg b
abc efg b
z abc 字符串长度不为n abc
abc 字符串不为空
文件测试运算符
属性检测描述如下:
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
---|---|
检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回false。 |
检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回true。 |
检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回false。 |
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回false。 |
检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回false。 |
检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回false。 |
检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回true。 |
检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回true。 |
检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回true。 |
检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回true。 |
检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回true。 |
实例
变量 file 表示文件"/var/www/runoob/test.sh",它的大小为100字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:file"/var/www/runoob/test.sh"r $file "文件可读""文件不可读"w $file "文件可写""文件不可写"x $file "文件可执行""文件不可执行"f $file "文件为普通文件""文件为特殊文件"d $file "文件是个目录""文件不是个目录"s $file "文件不为空""文件为空"e $file "文件存在""文件不存在"文件可读文件可写文件可执行文件为普通文件文件不是个目录文件不为空文件存在
EQ 就是 EQUAL等于
NE 就是 NOT EQUAL不等于
GT 就是 GREATER THAN大于
LT 就是 LESS THAN小于
GE 就是 GREATER THAN OR EQUAL 大于等于
LE 就是 LESS THAN OR EQUAL 小于等于