开发手册 欢迎您!
软件开发者资料库

Linux shell脚本中的操作符

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

1、算术运算符

shell的算术运算符与C语言里的差不多,优先级与顺序也相同。shell中所有变量是以字符串类型存储的,想要处理算术表达式,需要使用expr命令对算术表达式求值,

例如,

# expr 命令将它的参数当做一个表达式来求值,可以用来进行数学运算。#!/bin/bashx=4y=7z=`expr $x + $y`echo $zexit 0

除了上述方法,还可以使用$((...))的方法对算术表达式求值,

例如,

#!/bin/bashx=5
y=6echo $(($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)) # 输出 30echo $((x == y)) # 输出 0exit 0

2、关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。可以使用的关系运算符,如下表

算符

说明

-eq

判断两个数是否相等,相等返回 true。

-ne

判断两个数是否不相等,不相等返回 true。

-gt

判断左边的数是否大于右边的,如果是,则返回 true。

-lt

判断左边的数是否小于右边的,如果是,则返回 true。

-ge

判断左边的数是否大于等于右边的,如果是,则返回 true。

-le

判断左边的数是否小于等于右边的,如果是,则返回 true。

例如,

#!/bin/bashx=4y=9if [ $x -eq $y ]then   echo "$x -eq $y : x 等于 y"else   echo "$x -eq $y: x 不等于 y"fiif [ $x -ne $y ]then   echo "$x -ne $y: x 不等于 y"else   echo "$x -ne $y : x 等于 y"fiif [ $x -gt $y ]then   echo "$x -gt $y: x 大于 y"else   echo "$x -gt $y: x 不大于 y"fiif [ $x -lt $y ]then   echo "$x -lt $y: x 小于 y"else   echo "$x -lt $y: x 不小于 y"fiif [ $x -ge $y ]then   echo "$x -ge $y: x 大于或等于 y"else   echo "$x -ge $y: x 小于 y"fiif [ $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/bashx=12y=23if [ $x != $y ]then   echo "$x != $y : x 不等于 y"else   echo "$x == $y: x 等于 y"fiif [ $x -lt 93 -a $y -gt 16 ]then   echo "$x 小于 93 且 $y 大于 16 : 返回 true"else   echo "$x 小于 93 且 $y 大于 16 : 返回 false"fiif [ $x -lt 93 -o $y -gt 93 ]then   echo "$x 小于 93 或 $y 大于 93 : 返回 true"else   echo "$x 小于 93 或 $y 大于 93 : 返回 false"fiif [ $x -lt 5 -o $y -gt 93 ]then   echo "$x 小于 5 或 $y 大于 93 : 返回 true"else   echo "$x 小于 5 或 $y 大于 93 : 返回 false"fi

输出

$ ./demo.sh12 != 23 : x 不等于 y12 小于 93 且 23 大于 16 : 返回 true12 小于 93 或 23 大于 93 : 返回 true12 小于 5 或 23 大于 93 : 返回 false

4、字符串运算符

bash shell中进行字符串比较判断可以使用的运算符,如下表,

运算符

说明

=

判断两个字符串是否相等,相等返回 true。

!=

判断两个字符串是否不相等,不相等返回 true。

-z

判断字符串长度是否为0,为0返回 true。

-n

判断字符串长度是否不为 0,不为 0 返回 true。

$

判断字符串是否为空,不为空返回 true。

例如,

#!/bin/bashx="Java"y="Python"if [ $x = $y ]then   echo "$x = $y : x 等于 y"else   echo "$x = $y: x 不等于 y"fiif [ $x != $y ]then   echo "$x != $y : x 不等于 y"else   echo "$x != $y: x 等于 y"fiif [ -z $x ]then   echo "-z $x : 字符串长度为 0"else   echo "-z $x : 字符串长度不为 0"fiif [ -n "$x" ]then   echo "-n $x : 字符串长度不为 0"else   echo "-n $x : 字符串长度为 0"fiif [ $x ]then   echo "$x : 字符串不为空"else   echo "$x : 字符串为空"fi

输出:

$ ./demo.shJava = Python: x 不等于 yJava != Python : x 不等于 y-z Java : 字符串长度不为 0-n Java : 字符串长度不为 0Java : 字符串不为空

5、逻辑运算符

shell支持的逻辑运算符&&||&&:逻辑的 AND,||:逻辑的 OR 。

例如,

#!/bin/bashx=12y=23if [[ $x -lt 87 && $y -gt 87 ]]then   echo "返回 true"else   echo "返回 false"fiif [[ $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/bashfile="/home/wonhero/demo.sh"if [ -r $file ]then   echo "文件可读"else   echo "文件不可读"fiif [ -w $file ]then   echo "文件可写"else   echo "文件不可写"fiif [ -x $file ]then   echo "文件可执行"else   echo "文件不可执行"fiif [ -f $file ]then   echo "文件为普通文件"else   echo "文件为特殊文件"fiif [ -d $file ]then   echo "文件是个目录"else   echo "文件不是个目录"fiif [ -s $file ]then   echo "文件不为空"else   echo "文件为空"fiif [ -e $file ]then   echo "文件存在"else   echo "文件不存在"fi