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