Shell 和其他编程语言一样,支持多种运算符,包括:
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
实例
    运行实例 »
执行脚本,输出结果如下所示:
两数之和为 : 4
两点注意:
算术运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
算术运算符实例如下:
a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a 不等于 b
注意:
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
关系运算符实例如下:
10 -eq 20: a 不等于 b 10 -ne 20: a 不等于 b 10 -gt 20: a 不大于 b 10 -lt 20: a 小于 b 10 -ge 20: a 小于 b 10 -le 20: a 小于或等于 b
布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
布尔运算符实例如下:
10 != 20 : a 不等于 b 10 小于 100 且 20 大于 15 : 返回 true 10 小于 100 或 20 大于 100 : 返回 true 10 小于 5 或 20 大于 100 : 返回 false
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
逻辑运算符实例如下:
返回 false 返回 true
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
字符串运算符实例如下:
abc = efg: a 不等于 b abc != efg : a 不等于 b -z abc : 字符串长度不为 0 -n abc : 字符串长度不为 0 abc : 字符串不为空
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
其他检查符:
变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:
文件可读 文件可写 文件可执行 文件为普通文件 文件不是个目录 文件不为空 文件存在
自增和自减操作符
尽管 Shell 本身没有像 C、C++ 或 Java 那样的 ++ 和 -- 操作符,但可以通过其他方式实现相同的功能。以下是一些常见的方法:
使用 let 命令
let 命令允许对整数进行算术运算。
使用 $(( )) 进行算术运算
$(( )) 语法也是进行算术运算的一种方式。
使用 expr 命令
expr 命令可以用于算术运算,但在现代脚本中不如 let 和 $(( )) 常用。
使用 (( )) 进行算术运算
与 $(( )) 类似,(( )) 语法也可以用于算术运算。
以下是一个完整的示例脚本,演示了自增和自减操作的使用:
运行这个脚本会输出以下内容:
初始值: 5 自增后: 6 自减后: 5 使用 $(( )) 自增后: 6 使用 $(( )) 自减后: 5 使用 expr 自增后: 6 使用 expr 自减后: 5 使用 (( )) 自增后: 6 使用 (( )) 自减后: 5
9篇笔记:
笔记一:
EQ 就是 EQUAL等于
NE 就是 NOT EQUAL不等于
GT 就是 GREATER THAN大于
LT 就是 LESS THAN小于
GE 就是 GREATER THAN OR EQUAL 大于等于
LE 就是 LESS THAN OR EQUAL 小于等于
笔记二:
使用 [[ ... ]] 条件判断结构,而不是 [ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、< 和 > 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。
笔记三:
1、进行数值比较时,可以使用 [ expression1 OPexpression2 ],OP 可以为 -gt、-lt、-ge、-le、-eq、-ne 也可以使用 ((expression1 OP expression2)),OP 可以为 >、<、>=、<=、==、!=。这几个关系运算符都是测试整数表达式 expression1 和 expression2 之间的大小关系。
2、 >、<、==、!= 也可以进行字符串比较。
3、进行字符串比较时,== 可以使用 = 替代。
4、 == 和 !=进行字符串比较时,可以使用 [ string1 OP string2 ] 或者 [[ string1 OP string2 ]] 的形式。
5、 > 和 < 进行字符串比较时,需要使用[[ string1 OP string2 ]] 或者 [ string1 \OP string2 ]。也就是使用 [] 时,> 和 < 需要使用反斜线转义。
笔记四:
字符串比较是否为 null 这里:
#!/bin/basha="" if [ -n $a ] then echo "-n $a : 字符串长度不为 0" else echo "-n $a : 字符串长度为 0" fi
输出结果为:
-n : 字符串长度不为 0
从结果上看 -n $a 返回 true,这并正确,正确的做法是 $a 这里应该加上双引号,否则 -n $a 的结果永远是 true:
#!/bin/basha="" if [ -n "$a" ] then echo "-n $a : 字符串长度不为 0" else echo "-n $a : 字符串长度为 0" fi
-n : 字符串长度为 0
笔记五:
Shell 相加目前发现有 3 种写法:
1.
a=10 b=20 c=`expr ${a} + ${b}` echo "$c"
2.
c=$[ `expr 10 + 20` ] echo "$c"
3.
c=$[ 10 + 20 ] echo "$c"
初学者推荐第一种写法,虽然看着复杂,但逻辑清晰,不易混淆。
笔记六:
推荐用 $() 代替 ``:
val=`expr 10 + 20` val=$(expr 10 + 20)
笔记七:
相加补充一种方式:
a=10 b=20 c=$(($a+$b))
笔记八:
[] 表达式
注意:在 [] 表达式中,常见的 >, < 需要加转义字符,表示字符串大小比较,以 acill 码位置作为比较。不直接支持 >, < 运算符,还有逻辑运算符 || 、&& ,它需要用 -a[and] –o[or] 表示。
[[ ]] 表达式
注意:[[]] 运算符只是 [] 运算符的扩充。能够支持 >, < 符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| && ,不再使用 -a -o。
笔记九:
逻辑运算符的白话理解及实例:
command1 && command2 #命令1执行成功后,命令2才执行 command1 || command2 #命令1执行失败后,命令2才执行
注意: 主要用于连接两条命令,不能通过中括号来连接两个测试条件。
实例:
[ $UID=0 ] && echo "it's root!" #当前用户UID为0时,才会输出后面语句 [ $USER=root ] || echo "it's not root!" #如果当前用户不是root,则输出后面语句