Shell 基本运算符
Shell 支持的运算符包括
算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
算数运算
原生bash不支持简单的算数运算,但是可以通过其他命令来实现,例如awk
和expr
,常用的是expr
。
-
expr
是一款表达式计算工具,使用它能完成表达式的求值操作。语法为:`expr 表达式`
例如:`expr a + b`
;在mac中expr
的语法是:$(expr 表达式)
例如:$(expr a + b)
。 - 使用
[]
执行算术。比expr
更简单的可以使用[]
执行算数运算,使用expr
做运算时乘法运算*
必须加转义符\
,才能实现乘法运算;使用[]
则不需要转义。
#!/bin/bash
# 表达式和运算符之间要有空格,a+b写成:a + b
# 完整的表达式被 ` ` 包含, ` 反引号
var1=`expr 2 + 2` # 计算结果是 4
# 乘号 * 前面必须加反斜杠 \ 才能实现乘法运算,其他的运算不需要
var2=`expr 2 \* 2` # 计算结果是 4
# 在Mac中shell的expr语法是:$(expr 表达式)
var3=$(expr 2 + 2) # 计算结果是 4
var4=$(expr 2 \* 2) # 计算结果是 4
# 使用 [] 进行算数运算,乘法运算符 * 不需要转义
var5=$[2 + 2] # 计算结果是 4
var6=$[2 * 2] # 计算结果是 4
常用算数运算符有+、-、*、/、%(取余)、=(赋值)
,条件表达式运算符有==(相等。比较两个数字是否相同)、!=(不相等,比较两个数字是否不同)
,注意:条件表达式要放在方括号([]
)内,并且要有空格,例如:比较变量a和b是否相等[ $a == $b ]
。
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a=10,b=20:
运算符 | 说明 | 举例 |
---|---|---|
-eq |
检测两个数是否相等,相等返回true |
[ $a -eq $b ] 返回false |
-ne |
检测两个数是否不相等,不相等返回true |
[ $a -ne $b ] 返回true |
-gt |
检测左边的数是否大于右边的,如果是,则返回true |
[ $a -gt $b ] 返回false |
-lt |
检测左边的数是否小于右边的,如果是,则返回true |
[ $a -lt $b ] 返回true |
-ge |
检测左边的数是否大于等于右边的,如果是,则返回true |
[ $a -ge $b ] 返回false |
-le |
检测左边的数是否小于等于右边的,如果是,则返回true |
[ $a -le $b ] 返回true |
布尔运算符
下表列出了常用的布尔运算符,假定a=10,b=20:
运算符 | 说明 | 举例 |
---|---|---|
! |
非运算,表达式为true则返回false,否则返回true |
[ !false ] 返回true |
-o |
或运算,有一个表达式为true则返回true |
[ $a -lt 20 -o $b -gt 100 ] 返回true |
-a |
与运算,两个表达式都为true才返回true |
[ $a -lt 20 -a $b -gt 100 ] 返回false |
逻辑运算符
Shell的逻辑运算符如下,假定a=10,b=20:
运算符 | 说明 | 举例 |
---|---|---|
&& |
逻辑的AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回false |
|| |
逻辑的OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回true |
字符串运算符
Shell的字符串运算度如下,假定a="abc",b="efg"。
运算符 | 说明 | 举例 |
---|---|---|
= |
检测两个字符串是否相等,相等返回true |
[ $a = $b ] 返回false |
!= |
检测两个字符串是否相等,不相等返回true |
[ $a != $b ] 返回true |
-z |
检测字符串长度是否为0,为0返回true |
[ -z $a ] 返回false |
-n |
检测字符串长度是否为0,不为0返回true |
[ -n $a ] 返回true |
str |
检测字符串是否为空,不为空返回true |
[ $a ] 返回true |
> |
检测左边是否比右边大,如果是,返回true |
[ $a > $b ] 返回false |
< |
检测左边是否比右边小,如果是,返回true |
[ $a < $b ] 返回true |
文件测试运算符
文件测试运算符用于检测Uinx文件的各种属性。
操作符 | 说明 | 举例 |
---|---|---|
-b file |
检测file是否是块设备文件,如果是,则返回true |
[ -b $file ] 返回false |
-c file |
检测file是否是字符设备文件,如果是,则返回true |
[ -c $file ] 返回false |
-d file |
检测file是否存在并是目录,如果是,则返回true |
[ -d $file ] 返回false |
-f file |
检测file是否存在并是普通文件(既不是目录,也不是设备文件),如果是,则返回true |
[ -f $file ] 返回true |
-g file |
检测file是否设置了SGID位,如果是,则返回true |
[ -g $file ] 返回false |
-k file |
检测file是否设置了粘着位(Sticky Bit),如果是,则返回true |
[ -k $file ] 返回false |
-p file |
检测file是否是有名管道,如果是,则返回true |
[ -p $file ] 返回false |
-u file |
检测file是否设置了SUID位,如果是,则返回true |
[ -u $file ] 返回false |
-r file |
检测file是否存在并可读,如果是,则返回true |
[ -r $file ] 返回true |
-w file |
检测file是否可写,如果是,则返回true |
[ -w $file ] 返回true |
-x file |
检测file是否可执行,如果是,则返回true |
[ -x $file ] 返回true |
-s file |
检测file是否存在并非空(文件大小是否大于0),不为空返回true |
[ -s $file ] 返回true |
-e file |
检测file(包括目录)是否存在,如果是,则返回true |
[ -e $file ] 返回true |
-O file |
检查file是否存在并属当前用户所有 |
[ -O $file ] 返回true |
-G file |
检查file是否存在并且默认组与当前用户相同 |
[ -G $file ] 返回true |
file1 -nt file2 |
检查file1是否比file2新 |
[ $file1 -nt $file2 ] 返回true |
file1 -ot file2 |
检查file1是否比file2旧 |
[ $file1 -ot $file2 ] 返回false |