shell运算符

shell支持的运算符有:

  • 算数运算符
  • 整数比较运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

算术运算符


shell有4种方式可实现整数算术运算: expr命令, (()), [], let命令

下表列出了常用的算术运算符,假定变量 x 为 7,变量 y 为 3:

运算符说明举例
+加法expr $x + $y 结果为 10
-减法$[$x - $y] 结果为4
\*乘法expr $x \* $y 结果为  21, *符号需用\转义
/除法expr $x / $y 结果为 2。
%取余$(($x % $y)) 结果为 1。

示例代码:

#!/bin/bash  

x=7
y=3
val=`expr $x + $y`
echo "x + y : $val"

val=`expr $x - $y`
echo "x - y : $val"

val=`expr $x \* $y`
echo "x * y : $val"

val=`expr $x / $y`
echo "x / y : $val"

val=`expr $x % $y`
echo "x % y : $val"

输出结果如下:

x + y : 10
x - y : 4
x * y : 21
x / y : 2
x % y : 1

整数比较运算符


比较运行符也叫关系运算符,shell中只支持数字的关系运算不支持字符串,除非字符串的值是数字,设x=1,y=2

运算符说明举例
-eq 或 ==等于[ $x -eq $y ] 返回 false
-ne 或 !=不等于[ $x -ne $y ] 返回true
-gt大于,左边数是否大于右边[ $x -gt $y ] 返回 false
-ge大于或等于[ $x -ge y$b ] 返回 false
-lt小于,如果是左边数是否小于右边[ $x -lt $y ] 返回 true。
-le小于或等于[ $x -le $y ] 返回 true。
<小于(($x<$y))
<=小于或等于(($x<=$y))
>大于(($x>$y))
>=大于或等于(($x>=$y))

表达式中方括号、运算符和变量之间都有必须空格分开

#!/bin/bash  

x=5
y=8
if [ $x eq $y ]
then
  echo "x等于y"
else
  echo "x不等于y"
fi
if [ $x != $y ]
then 
  echo "x真的不等于y"
else
  echo "x真的等于y"
fi
if [ $x -gt $y ]
then
  echo "x大于y"
else
  echo "x小于y"
fi

输出结果:

x不等于y
x真的不等于y
x小于y

布尔运算符


布尔运算符说明,设x=10,y=20

运算符说明举例
!非运算[ ! false ] 返回true
-o或运算 or,两个表达式其中一个为true,则返回true[ $x -lt 13 -o $y -gt 23 ] 返回 true。
-a与运算 and,两个表达式都为true则返回true[ $x -lt 13 -a $y -gt 13 ] 返true。

布尔运算只能放在中括号:[] 内或 test指令后才有效

逻辑运算符


以下介绍 Shell 的逻辑运算符,假定变量 x=10, y =20:

运算符说明举例
&&逻辑的 AND[[ $x -lt 100 && $y -gt 100 ]] 返回 false
||逻辑的 or[[ $x -lt 100 && $y -gt 100 ]] 返回 true

逻辑运算必须放在 [[]] 或 (())中才有效

! 可以用在[],[[]]中, 不可以在(())

示例:

x=10
y=20
echo "有x=${x},y=${y}"
if [[ $x -lt 100 && $y -gt 100 ]]
then
  echo "x<100 且 y>100 成立"
else
  echo "x<100 且 y>100 不成立"
fi
if [ $x -lt 100 -o $y -gt 100 ]
then
  echo "x<100 或者 y>100 成立"
else
  echo "x<100 或者 y>100 不成立"
fi
if [[ $x < $y ]]
then
  echo "[[x<y]] 成立"
fi
if [ $x != $y ]
then
  echo "[x!=y] 成立"
fi

输出结果:

x不等于y
x真的不等于y
x小于y
有x=10,y=20
x<100 且 y>100 不成立
x<100 或者 y>100 成立
[[x<y]] 成立
[x!=y] 成立

字符串运算符


下表列出了常用的字符串运算符,假定变量 x为 "abc",变量 y 为 "efg":

运算符说明举例
=检测两个字符串是否相等,相等返回 true[ $x = $y ] 返回 false
!=检测两个字符串是否不相等,不相等返回 true[ $x != $y ] 返回 true
-z检测字符串长度是否为0,为0返回 true[ -z $x ] 返回 false
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n "$x" ] 返回 true
$检测字符串是否不为空,不为空返回 true[ $x ] 返回 true

示例:

#!/bin/bash

a="welcome" b="wenesday " c=1 d=2  #初始变量赋值
echo "a=${a},b=${b},c=${c},d=${d}"

if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi

if [[ $a > $b ]]
then
   echo "$a > $b : a 大于 b"
else
   echo "$a > $b: a 不大于 b"
fi

if [ $a \> $b ]
then
   echo "$a > $b : a 大于 b"
else
   echo "$a > $b: a 不大于 b"
fi

if [[ $c > $d ]]
then
   echo "$c > $d : c 大于 d"
else
   echo "$c > $d: c 不大于 d"
fi

if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi

if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi

if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

文件测试运算符


文件测试运算符用于检测文件的各种属性

常用文件测试运算符列表:

操作符说明
-b file检测文件是否是块设备文件,如果是,则返回 true
-c file检测文件是否是字符设备文件,如果是,则返回 true
-d file检测文件是否是目录,如果是,则返回 true。 [ -d filename ]
-e file检测文件(包括目录)是否存在,如果是,则返回 true
-f file检测文件是否是普通文件(既不是目录,也不是设备文件)
-g file检测文件是否设置了 SGID 位,如果是,则返回 true
-k file检测该文件是否存在,并且是否拥有 SBIT 权限
-p file检测文件是否是命名管道,如果是,则返回 true
-u file检测文件是否设置了 SUID 位,如果是,则返回 true
-r file检测文件是否可读,如果是,则返回true
-w file检测文件是否可写,如果是,则返回 true
-x file检测文件是否可执行,如果是,则返回 true
-s file检测文件是否存在,且大小为非空
-S file检测文件是否是套接字文件。
-L file检测文件是否存在并且是一个符号链接文件。

示例:

#!/bin/bash  

file="/home/a.sh"  

if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

if [ -d $file ]  
then  
   echo "文件是个目录"  
else  
   echo "文件${file}不是目录"  
fi 

if [ -r $file ]  
then  
   echo "文件${file}可读"  
else  
   echo "文件不可读"  
fi  

if [ -w $file ]  
then  
   echo "文件${file}可写"  
else  
   echo "文件不可写"  
fi  
if [ -x $file ]  
then  
   echo "文件可执行"  
else  
   echo "文件不可执行"  
fi  

if [ -f $file ]  
then  
   echo "文件为${file}普通文件"  
else  
   echo "文件为特殊文件"  
fi   

if [ -s $file ]  
then  
   echo "文件${file}不为空"  
else  
   echo "文件为空"  
fi