Shell 支持多种运算符(算数、关系、布尔、字符串、文件测试等),不过Bash不支持简单的数学运算,但是可以通过其他命令来实现,如:expr、awk
1. 算数运算符
1.1 linux expr命令
expr命令是一个手工命令行计算器,用于在Unix/Linux下求表达式变量的值,一般用于整数值,也可以用于字符串
使用方法: expr 表达式
说明:
- 用
空格隔开每个项 - 用反斜杠
\放在Shell特定的字符前面 - 对包含空格和其他特殊字符的字符串要用引号括起来
实例:
# 计算字符串长度expr length "this is a test" # 14# 截取字符串expr substr "this is a test" 3 5 # is is# 检索第一个字符出现的位置expr index "this is a test" h # 1#整数运算expr 10 + 10 # 20,数学计算结果expr 10+10 # 10+10 字符串结果,很可能不符合预期expr 14 % 9 # 5expr 30 / 3 / 2 # 5expr 30 \* 3 # 90 # 使用乘号*时,必须用反斜线屏蔽其特定含义,避免Shell误解*含义expr 30 * 3 # Syntax errora=10b=`expr 10 + 10` # 表达式计算需要放到反引号``内`expr $a + $b` # 30`expr $a - $b` # -10`expr $a \* $b` # 200`expr $b / $a` # 2`expr $b % 6` # 2c=$b # 把变量b赋值给c
2. 关系运算符
关系运算符只支持数字运算,不支持字符串运算(除非字符串的值是数字)
#!/bin/bash# author:yonglong.wyl# data:2021/06/03# 通过终端入口传入a=$1b=$2# == 数值相等运算符,等效 -eqif [ $a == $b ]thenecho "$a == $b"fi# != 数值不相等运算符,等效 -neif [ $a != $b ]thenecho "$a != $b"fi# -eq 数值相等运算符,等效 ==if [ $a -eq $b ]thenecho "$a -eq $b"fi# -ne 数值不等效运算符,等效 !=if [ $a -ne $b ]thenecho "$a -ne $b"fi# -gt 数值大于运算符,形象类似:>if [ $a -gt $b ]thenecho "$a -gt $b"fi# -lt 数值小于运算符,形象类似:<if [ $a -lt $b ]thenecho "$a -lt $b"fi# -ge 数值大于等于运算符,形象类似:>=if [ $a -ge $b ]thenecho "$a -ge $b"fi# -le 数值小于等于运算符,形象类似:<=if [ $a -le $b ]thenecho "$a -le $b"fi
3. 布尔运算符
#!/bin/bash# author: yonglong.wyl# data: 2021/06/03a=10b=20# ! 非运算,表达式的值取反if [ $a != $b ]thenecho "$a != $b : a 不等于b"fi# -a 与运算,两个表达式都为true才返回trueif [ $a -lt 100 -a $b -gt 15 ]thenecho "$a 小于 100 且 $b 大于 15:返回 true"elseecho "$a 小于 100 且 $b 大于 15:返回 false"fi# -o 或运算,有一个表达式为true则返回trueif [ $a -lt 100 -o $b -gt 100 ]thenecho "$a 小于100 或 $b 大于 100:返回 true"elseecho "$a 小于100 或 $b 大于100: 返回 false"fi~
逻辑运算符
#!/bin/bash# author: yonglong.wyl# data: 2021/06/03a=10b=20# && 逻辑AND,同时为true才返回trueif [[ $a -lt 100 && $b -gt 100 ]] #注意逻辑操作运算:两个[]嵌套thenecho "返回 true"elseecho "返回 false"fi# || 逻辑OR,只要有一个为true,则返回trueif [[ $a -lt 100 || $b -gt 100 ]]thenecho "返回 true"elseecho "返回 false"fi
字符运算符
#!/bin/bash# author: yonglong.wyl# data: 2021/06/03a="abc"b="efg"# [ = ] 检测两个字符串是否相等,相等返回 true,注意:一个等号= + [] 组成if [ $a = $b ]thenecho "$a = $b: a 等于 b"elseecho "$a = $b: a 不等于 b"fi# [ != ] 检测两个字符串是否不相等,不相等返回 trueif [ $a != $b ]thenecho "$a != $b : a 不等于 b"elseecho "$a != $b : a 等于 b"fi# [ -z ] 检测字符串长度是否为0,为0返回 trueif [ -z $a ]thenecho "-z $a : 字符串长度为 0"elseecho "-z $a : 字符串长度不为 0"fi# [ -n ] 检测字符串长度是否不为0,不为0则返回 trueif [ -n $a ]thenecho "-n $a : 字符串长度不为 0"elseecho "-n $a : 字符串长度为 0"fi# [ $ ] 直接引用变量,检测变量是否为空,不为空返回 trueif [ $a ]thenecho "$a : 字符串不为空"elseecho "$a : 字符串为空"fi
文件测试运算符
#!/bin/bash# author: yonglong.wyl# data: 2021/06/03file="/Users/yonglong.wyl/Works/trip/ex-shell/ex7_file_operator.sh"# -r 文件是否可读if [ -r $file ]thenecho "文件可读"elseecho "文件不可读"fi# -w 文件是否可写if [ -w $file ]thenecho "文件可写"elseecho "文件不可写"fi# -x 文件是否可运行if [ -x $file ]thenecho "文件可执行"elseecho "文件不可执行"fi# -f 文件是否为普通文件,非目录,非设备文件if [ -f $file ]thenecho "文件为普通文件"elseecho "文件为特殊文件"fi# -d 是否是目录,目录则返回 trueif [ -d $file ]thenecho "文件是个目录"elseecho "文件不是目录"fi# -s 文件是否为空,文件大小是否大于0,存在返回 trueif [ -s $file ]thenecho "文件不为空"elseecho "文件为空"fi# -e 检测文件包括目录是否存在,存在返回 trueif [ -e $file ]thenecho "文件/目录 存在"elseecho "文件/目录 不存在"fi
