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 |










网友评论