和其他编程语言类似,Shell支持多种运算符:算数运算符、自增自减运算符、关系运算符、布尔运算符、逻辑运算符、字符串运算符和文件测试运算符
1、算数运算符
原生Bash不支持简单的数学运算,只能通过其他命令来实现,例如awk
和expr
expr
是一款最常用的表达式计算工具,它能帮助我们完成表达式的求值操作
Shell中常用的算术运算符及使用如下:
运算符 | 名称 | 语法 |
---|---|---|
+ | 加 | `expr $a + $b` |
- | 减 | `expr $a - $b` |
* | 乘 | `expr $a \* $b` |
/ | 除 | `expr $b / $a` |
% | 取余 | `expr $b % $a` |
= | 赋值 | a=$b |
== | 相等 | [ $a == $b ] |
!= | 不相等 | [ $a != $b ] |
使用注意:
- 表达式与运算符之间要有空格
- 完整的求值表达式必须被
` `
包含 - 条件表达式必须放在
[]
之间,且要有空格
以下是一个示例:
#!/bin/bash
a=2
b=3
val=`expr $a - $b`
echo "a - b = $val"
val=`expr $a \* $b`
echo "a * b = $val"
if [ $a == $b ]
then
echo "a 等于 b"
else
echo "a 不等于 b"
fi
执行脚本,输出结果如下:
a - b = -1
a * b = 6
a 不等于 b
2、自增自减运算符
Shell本身没有提供类似Java那样的++
和--
操作符,但可以通过其他方式实现该功能
以下是一些常见的方式:
2.1、使用let命令
let
命令允许对整数进行自增自减算术运算。使用语法如下:
# 自增
let i++
# 自减
let i--
2.2、使用$(( ))语法
$(( ))
是进行算术运算的语法之一。使用语法如下:
# 自增
i=$((i + 1))
# 自减
i=$((i - 1))
2.3、使用(( ))语法
与$(( ))
类似,(( ))
也是用于算术运算的语法之一。使用语法如下:
# 自增
((i++))
# 自减
((i--))
2.4、使用expr命令
expr
命令可以用于算术运算,但不如let
和$(( ))
常用。使用语法如下:
# 自增
i=$(expr $i + 1)
# 自减
i=$(expr $i - 1)
以下是一个示例:
#!/bin/bash
i=5
# 自增
let i++
echo "$i"
# 自减
i=$((i - 1))
echo "$i"
# 自增
((i++))
echo "$i"
执行脚本,输出结果如下:
6
5
6
3、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
Shell中常用的关系运算符及使用如下:
运算符 | 名称 | 语法 |
---|---|---|
-eq | 等于 | [ $a -eq $b ] |
-ne | 不等于 | [ $a -ne $b ] |
-gt | 大于 | [ $a -gt $b ] |
-lt | 小于 | [ $a -lt $b ] |
-ge | 大于等于 | [ $a -ge $b ] |
-le | 小于等于 | [ $a -le $b ] |
以下是一个示例:
#!/bin/bash
a=2
b=3
if [ $a -eq $b ]
then
echo "$a 等于 $b"
else
echo "$a 不等于 $b"
fi
执行脚本,输出结果如下:
2 不等于 3
4、布尔运算符
Shell中的布尔运算符包括:与或非
运算符 | 名称 | 描述 |
---|---|---|
! | 非 | 真为假,假为真 |
-o | 或 | 有真为真,全假为假 |
-a | 与 | 有假为假,全真为真 |
以下是一个示例:
#!/bin/bash
a=2
b=3
if [ $b -lt 10 -a $a -gt 1 ]
then
echo "$b 小于 10 且 $a 大于 1 : 返回 true"
fi
执行脚本,输出结果如下:
3 小于 10 且 2 大于 1 : 返回 true
5、逻辑运算符
Shell中的逻辑运算符与Java相同,包括:逻辑AND和逻辑OR
运算符 | 名称 | 语法示例 |
---|---|---|
&& | 逻辑AND | [[ $a -lt 10 && $b -gt 1 ]] |
|| | 逻辑OR | [[ $a -lt 10 || $b -gt 1 ]] |
以下是一个示例:
#!/bin/bash
a=2
b=3
if [[ $b -lt 10 && $a -gt 1 ]]
then
echo "$b 小于 10 且 $a 大于 1 : 返回 true"
fi
执行脚本,输出结果如下:
3 小于 10 且 2 大于 1 : 返回 true
6、字符串运算符
Shell中常用的字符串运算符及使用如下:
运算符 | 名称 | 语法 |
---|---|---|
= | 两个字符串是否相等 | [ $a = $b ] |
!= | 两个字符串是否不相等 | [ $a != $b ] |
=~ | 字符串是否与正则匹配 | [ $a =~ regex ] |
-z | 字符串是否为空(长度是否为0) | [ -z $a ] |
-n | 字符串是否非空(长度是否不为0) | [ -n $a ] |
$ | 字符串是否不为空 | [ $a ] |
以下是一个示例:
#!/bin/bash
a="abc"
b=""
if [ -z $b ];then
echo "$b 字符串长度为0"
fi
if [ -n "$a" ];then
echo "$a 字符串长度不为0"
fi
if [ $b ];then
echo "$b 字符串为空"
fi
if [ $a =~ "^a" ];then
echo "$a 字符串匹配正则"
fi
执行脚本,输出结果如下:
字符串长度为0
abc 字符串长度不为0
字符串为空
abc 字符串匹配正则
7、文件测试运算符
文件测试运算符用于检测Unix文件的各种属性
运算符 | 名称 | 语法 |
---|---|---|
-d | 是否是目录 | [ -d $file ] |
-f | 是否是文件 | [ -f $file ] |
-r | 是否可读 | [ -r $file ] |
-w | 是否可写 | [ -w $file ] |
-x | 是否可执行 | [ -x $file ] |
-s | 是否为空(文件大小是否大于0) | [ -s $file ] |
-e | 文件或目录是否存在 | [ -e $file ] |
以下是一个示例:
#!/bin/bash
file="/var/log/test.log"
if [ -f $file ];then
echo "$file 是普通文件"
fi
if [ -d $file ];then
echo "$file 是目录"
fi
if [ -e $file ];then
echo "文件或目录存在"
else
echo "文件或目录不存在"
fi
执行脚本,输出结果如下:
/var/log/test.log 是普通文件
文件或目录存在