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 # 5
expr 30 / 3 / 2 # 5
expr 30 \* 3 # 90 # 使用乘号*时,必须用反斜线屏蔽其特定含义,避免Shell误解*含义
expr 30 * 3 # Syntax error
a=10
b=`expr 10 + 10` # 表达式计算需要放到反引号``内
`expr $a + $b` # 30
`expr $a - $b` # -10
`expr $a \* $b` # 200
`expr $b / $a` # 2
`expr $b % 6` # 2
c=$b # 把变量b赋值给c
2. 关系运算符
关系运算符只支持数字运算,不支持字符串运算(除非字符串的值是数字)
#!/bin/bash
# author:yonglong.wyl
# data:2021/06/03
# 通过终端入口传入
a=$1
b=$2
# == 数值相等运算符,等效 -eq
if [ $a == $b ]
then
echo "$a == $b"
fi
# != 数值不相等运算符,等效 -ne
if [ $a != $b ]
then
echo "$a != $b"
fi
# -eq 数值相等运算符,等效 ==
if [ $a -eq $b ]
then
echo "$a -eq $b"
fi
# -ne 数值不等效运算符,等效 !=
if [ $a -ne $b ]
then
echo "$a -ne $b"
fi
# -gt 数值大于运算符,形象类似:>
if [ $a -gt $b ]
then
echo "$a -gt $b"
fi
# -lt 数值小于运算符,形象类似:<
if [ $a -lt $b ]
then
echo "$a -lt $b"
fi
# -ge 数值大于等于运算符,形象类似:>=
if [ $a -ge $b ]
then
echo "$a -ge $b"
fi
# -le 数值小于等于运算符,形象类似:<=
if [ $a -le $b ]
then
echo "$a -le $b"
fi
3. 布尔运算符
#!/bin/bash
# author: yonglong.wyl
# data: 2021/06/03
a=10
b=20
# ! 非运算,表达式的值取反
if [ $a != $b ]
then
echo "$a != $b : a 不等于b"
fi
# -a 与运算,两个表达式都为true才返回true
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15:返回 true"
else
echo "$a 小于 100 且 $b 大于 15:返回 false"
fi
# -o 或运算,有一个表达式为true则返回true
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于100 或 $b 大于 100:返回 true"
else
echo "$a 小于100 或 $b 大于100: 返回 false"
fi
~
逻辑运算符
#!/bin/bash
# author: yonglong.wyl
# data: 2021/06/03
a=10
b=20
# && 逻辑AND,同时为true才返回true
if [[ $a -lt 100 && $b -gt 100 ]] #注意逻辑操作运算:两个[]嵌套
then
echo "返回 true"
else
echo "返回 false"
fi
# || 逻辑OR,只要有一个为true,则返回true
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
字符运算符
#!/bin/bash
# author: yonglong.wyl
# data: 2021/06/03
a="abc"
b="efg"
# [ = ] 检测两个字符串是否相等,相等返回 true,注意:一个等号= + [] 组成
if [ $a = $b ]
then
echo "$a = $b: a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
# [ != ] 检测两个字符串是否不相等,不相等返回 true
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b : a 等于 b"
fi
# [ -z ] 检测字符串长度是否为0,为0返回 true
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
# [ -n ] 检测字符串长度是否不为0,不为0则返回 true
if [ -n $a ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
# [ $ ] 直接引用变量,检测变量是否为空,不为空返回 true
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
文件测试运算符
#!/bin/bash
# author: yonglong.wyl
# data: 2021/06/03
file="/Users/yonglong.wyl/Works/trip/ex-shell/ex7_file_operator.sh"
# -r 文件是否可读
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
# -w 文件是否可写
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
# -x 文件是否可运行
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
# -f 文件是否为普通文件,非目录,非设备文件
if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
# -d 是否是目录,目录则返回 true
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是目录"
fi
# -s 文件是否为空,文件大小是否大于0,存在返回 true
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
# -e 检测文件包括目录是否存在,存在返回 true
if [ -e $file ]
then
echo "文件/目录 存在"
else
echo "文件/目录 不存在"
fi