Linux 中每个shell都支持各种操作符。包括算术运算符、关系运算符、布尔操作符、字符串运算符、文件测试操作符。本文主要介绍 bash shell脚本 操作符。

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


推荐文档