1、算术运算符
shell的算术运算符与C语言里的差不多,优先级与顺序也相同。shell中所有变量是以字符串类型存储的,想要处理算术表达式,需要使用expr命令对算术表达式求值,
例如,
# expr 命令将它的参数当做一个表达式来求值,可以用来进行数学运算。
#!/bin/bash
x=4
y=7
z=`expr $x + $y`
echo $z
exit 0
除了上述方法,还可以使用$((...))
的方法对算术表达式求值,
例如,
#!/bin/bash
x=5
y=6
echo $(($x + $y)) # 输出11,在变量名前加上$,在shell中一般是取变量值的意思
echo $((x + y)) # 输出11,变量前不加$也是可以的
echo $((x | y)) # 输出 7 。这里的 | 是按位或操作符
echo $((x || y)) # 输出 1 。这里的 || 是逻辑或操作符
echo $((x & y)) # 输出 4 。这里的 & 是按位与操作符
echo $((x && y)) # 输出 1 ,这里的 && 是逻辑与操作符
echo $((x * y)) # 输出 30
echo $((x == y)) # 输出 0
exit 0
2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。可以使用的关系运算符,如下表
算符 | 说明 |
-eq | 判断两个数是否相等,相等返回 true。 |
-ne | 判断两个数是否不相等,不相等返回 true。 |
-gt | 判断左边的数是否大于右边的,如果是,则返回 true。 |
-lt | 判断左边的数是否小于右边的,如果是,则返回 true。 |
-ge | 判断左边的数是否大于等于右边的,如果是,则返回 true。 |
-le | 判断左边的数是否小于等于右边的,如果是,则返回 true。 |
例如,
#!/bin/bash
x=4
y=9
if [ $x -eq $y ]
then
echo "$x -eq $y : x 等于 y"
else
echo "$x -eq $y: x 不等于 y"
fi
if [ $x -ne $y ]
then
echo "$x -ne $y: x 不等于 y"
else
echo "$x -ne $y : x 等于 y"
fi
if [ $x -gt $y ]
then
echo "$x -gt $y: x 大于 y"
else
echo "$x -gt $y: x 不大于 y"
fi
if [ $x -lt $y ]
then
echo "$x -lt $y: x 小于 y"
else
echo "$x -lt $y: x 不小于 y"
fi
if [ $x -ge $y ]
then
echo "$x -ge $y: x 大于或等于 y"
else
echo "$x -ge $y: x 小于 y"
fi
if [ $x -le $y ]
then
echo "$x -le $y: x 小于或等于 y"
else
echo "$x -le $y: x 大于 y"
fi
输出:
4 -eq 9: x 不等于 y 4 -ne 9: x 不等于 y 4 -gt 9: x 不大于 y 4 -lt 9: x 小于 y 4 -ge 9: x 小于 y 4 -le 9: x 小于或等于 y
3、布尔操作符
bash shell中支持的布尔运算符,如下表,
算符 | 说明 |
! | 非运算,表达式为 true 则返回 false,否则返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 |
例如,
#!/bin/bash
x=12
y=23
if [ $x != $y ]
then
echo "$x != $y : x 不等于 y"
else
echo "$x == $y: x 等于 y"
fi
if [ $x -lt 93 -a $y -gt 16 ]
then
echo "$x 小于 93 且 $y 大于 16 : 返回 true"
else
echo "$x 小于 93 且 $y 大于 16 : 返回 false"
fi
if [ $x -lt 93 -o $y -gt 93 ]
then
echo "$x 小于 93 或 $y 大于 93 : 返回 true"
else
echo "$x 小于 93 或 $y 大于 93 : 返回 false"
fi
if [ $x -lt 5 -o $y -gt 93 ]
then
echo "$x 小于 5 或 $y 大于 93 : 返回 true"
else
echo "$x 小于 5 或 $y 大于 93 : 返回 false"
fi
输出:
$ ./demo.sh
12 != 23 : x 不等于 y
12 小于 93 且 23 大于 16 : 返回 true
12 小于 93 或 23 大于 93 : 返回 true
12 小于 5 或 23 大于 93 : 返回 false
4、字符串运算符
bash shell中进行字符串比较判断可以使用的运算符,如下表,
运算符 | 说明 |
= | 判断两个字符串是否相等,相等返回 true。 |
!= | 判断两个字符串是否不相等,不相等返回 true。 |
-z | 判断字符串长度是否为0,为0返回 true。 |
-n | 判断字符串长度是否不为 0,不为 0 返回 true。 |
$ | 判断字符串是否为空,不为空返回 true。 |
例如,
#!/bin/bash
x="Java"
y="Python"
if [ $x = $y ]
then
echo "$x = $y : x 等于 y"
else
echo "$x = $y: x 不等于 y"
fi
if [ $x != $y ]
then
echo "$x != $y : x 不等于 y"
else
echo "$x != $y: x 等于 y"
fi
if [ -z $x ]
then
echo "-z $x : 字符串长度为 0"
else
echo "-z $x : 字符串长度不为 0"
fi
if [ -n "$x" ]
then
echo "-n $x : 字符串长度不为 0"
else
echo "-n $x : 字符串长度为 0"
fi
if [ $x ]
then
echo "$x : 字符串不为空"
else
echo "$x : 字符串为空"
fi
输出:
$ ./demo.sh Java = Python: x 不等于 y Java != Python : x 不等于 y -z Java : 字符串长度不为 0 -n Java : 字符串长度不为 0 Java : 字符串不为空
5、逻辑运算符
shell支持的逻辑运算符&&
和||
,&&:逻辑的 AND,||:逻辑的 OR 。
例如,
#!/bin/bash
x=12
y=23
if [[ $x -lt 87 && $y -gt 87 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $x -lt 87 || $y -gt 87 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
输出:
$ ./demo.sh
返回 false
返回 true
6、文件判断运算符
文件判断运算符用于检测 Linux 文件的各种属性。具体如下表,
操作符 | 说明 |
-b file | 判断文件是否是块设备文件,如果是,则返回 true。 |
-c file | 判断文件是否是字符设备文件,如果是,则返回 true。 |
-d file | 判断文件是否是目录,如果是,则返回 true。 |
-f file | 判断文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 |
-g file | 判断文件是否设置了 SGID 位,如果是,则返回 true。 |
-k file | 判断文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 |
-L file | 判断文件是否存在并且是一个符号链接。 |
-p file | 判断文件是否是有名管道,如果是,则返回 true。 |
-u file | 判断文件是否设置了 SUID 位,如果是,则返回 true。 |
-r file | 判断文件是否可读,如果是,则返回 true。 |
-w file | 判断文件是否可写,如果是,则返回 true。 |
-x file | 判断文件是否可执行,如果是,则返回 true。 |
-s file | 判断文件是否为空(文件大小是否大于0),不为空返回 true。 |
-S file | 判断某文件是否 socket。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 |
例如,
#!/bin/bash
file="/home/cjavapy/demo.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi