Linux中shell运算符详解

Bash 支持很多运算符,其中包括:

 - 算数运算符 
 - 关系运算符 
 - 逻辑运算符 
 - 字符串运算符 
 - 文件测试运算符

算数运算符

算术运算符包括:
这里写图片描述

其实原生bash不支持简单的数学运算,但是可以通过其他命令来实现,
例如 awk 和 expr命令,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

举例说明:

#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

a=10
b=20

result=`expr $a + $b`
echo "a + b = $result"

result=`expr $a - $b`
echo "a - b = $result"

result=`expr $a \* $b`
echo "a * b = $result"

result=`expr $b / $a`
echo " b / a = $result"

result=`expr $b % $a`
echo "b % a = $result"


运行结果:

a + b = 30
a - b = -10
a * b = 200
b / a = 2
b % a = 0

以下几点需要注意:

1.表达式和运算符之间要有空格。
例如: 5+10 是不对的,必须写成 5 + 10,这与我们熟悉的大多数编程语言不一样。

2.完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

3.乘号(*)前边必须加反斜杠(\)进行转义才能实现乘法运算。

关系运算符

关系运算符包括:

在[]中使用的比较符 在(()和[[]]}中使用的比较符 说明 举例
-eq == equal的缩写,表相等 [ $a -eq $b ] 返回true
-ne != not equal的缩写,表不相等 [ $a -eq $b ] 返回true
-gt > greater thanl的缩写,表大于 [ $a -gt $b ] 返回true
-ge >= greater equal的缩写,表大于等于 [ $a -ge $b ] 返回true
-lt < greater equal的缩写,表小于 [ $a -lt $b ] 返回true
-le <= greater equal的缩写,表小于等于 [ $a -lq $b ] 返回true
提示:
1. "<"符号意思是小于,要么:if [[ "$a" <  "$b" ]] 是错误的,要么:if [ "$a"  \<  "$b" ] (即在单[]中需要转义,因为shell也用 <和>表示重定向)。
2. ">"符号意思是大于,要么:if [[ "$a" >  "$b" ]] 是错误的,要么:if [ "$a"  \> "$b" ] (即在单[]中需要转义,因为shell也用 <和>表示重定向)。
3. 关系运算符只支持数字(整数),不支持字符串,除非字符串的值是数字(整数)。
4. 条件表达式要放在方括号之间,并且要有空格,例如 [[$a==$b]] 是错误的,必须写成 [[ $a == $b ]]。

举例说明:

#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

a=5
b=10

if [ $a -eq $b ]
then
	echo "eq 关系运算结果: a等于b"
else
	echo "eq 关系运算结果: a不等于b"
fi


if [ $a -ne $b ]
then 
	echo "ne 关系运算结果: a不等于b"
else
	echo "ne 关系运算结果: a等于b"
fi


if [ $a -gt $b ]
then
	echo "gt 关系运算结果: a大于b"
else
	echo "gt 关系运算结果: a小于等于b"
fi


if [ $a -lt $b ]
then
	echo "lt 关系运算结果:a小于b"
else
	echo "lt 关系运算结果:a大于等于b"
fi


if [ $a -ge $b ]
then
	echo "ge 关系运算结果:a大于等于b"
else
	echo "ge 关系运算结果:a小于b"
fi


if [ $a -le $b ]
then
	echo "le 关系运算结果:a小于等于b"
else 
	echo "le 关系运算结果:a大于b"
fi

运行结果:

eq 关系运算结果: a不等于b
ne 关系运算结果: a不等于b
gt 关系运算结果: a小于等于b
lt 关系运算结果:a小于b
ge 关系运算结果:a小于b
le 关系运算结果:a小于等于b

逻辑运算符

在[ ]中使用的比较符 在(()和[[]]}中使用的比较符 说明 举例
赋值 a=10 b=25
-a && 与运算,两个表达式都为true,才返回true [ $a -lt 20 -a $b -gt 20 ] 返回true
-o || 或运算,有一个表达式都为true,则返回true [ $a -lt 20 -o $b -gt 100 ] 返回true
! ! 非运算,表达式为true,则返回false [ ! false ] 返回true
小结:逻辑操作符使用总结
[ ]中用 -a,-o, !
[[ ]]中用 &&,||, !
test 用法和 [ ]相同

举例说明:

#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

a=5
b=10


if [ $a != $b ]
then
	echo "!= 逻辑非运算结果:a不等于b"
else 
	echo "!=逻辑非运算结果: a等于b"
fi

if [ $a -lt 50 -a  $b -gt 8 ]
then
	echo "and 逻辑与运算结果:真"
else
	echo "and 逻辑与运算结果:假"
fi


if [ $a -lt 50 -o $b -gt 12 ]
then
	echo "or 逻辑或运算结果:真"
else
	echo "or 逻辑或运算结果:假"
fi

if [ $a -lt 3 -o $b -gt 8 ]
then
	echo "or 逻辑或运算结果:真"
else
	echo "or 逻辑或运算结果:假"
fi

运行结果:

!= 逻辑非运算结果:a不等于b
and 逻辑与运算结果:真
or 逻辑或运算结果:真
or 逻辑或运算结果:真

字符串运算符
字符串运算符包括:

运算符 说明 举例
= 检测两个字符串是否相等,相等则返回true [ $a = $b ] 返回true
!= 检测两个字符串是否相等,不相等则返回true [ $a != $b ] 返回true
-z 检测字符串长度是否为0,为0则返回true [ -z $b ] 返回true
-n 检测字符串长度是否为0,不为0则返回true [ -n $b ] 返回true
str 检测字符串是否为null,不为null则返回true [ $b ] 返回true
#经测试:
字符串比较用单等号或双等号都可以,而且外边的中括号最好是用双中括号,这样结果比较准确。

举例说明:

[root@myhost ~]# string="abcde"
[root@myhost ~]# if [[ "$string" == abc* ]]; then  echo "abc开头"; else echo "不是"; fi
abc开头
[root@myhost ~]# if [ "$string" == abc* ]; then  echo "abc开头"; else echo "不是"; fi
不是
[root@myhost ~]# if [ "$string" = abc* ]; then  echo "abc开头"; else echo "不是"; fi
不是
[root@myhost ~]# if [[ "$string" = abc* ]]; then  echo "abc开头"; else echo "不是"; fi
abc开头

[root@myhost ~]# string="abcde"
[root@myhost ~]# if [[ "$string" = "abc*" ]]; then  echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [[ "$string" == "abc*" ]]; then  echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [ "$string" == "abc*" ]; then  echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [ "$string" = "abc*" ]; then  echo "不相等"; else echo "不等"; fi
不等

举例说明:



#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

a="cfe"
b="efr"

if [ "$a" = "$b" ]
then 
	echo "字符串a和字符串b相等"
else
	echo "字符串a和字符串b不相等"
fi

if [ "$a" == "$b" ]
then 
	echo "字符串a和字符串b相等"
else
	echo "字符串a和字符串b不相等"
fi

[root@myhost ~]# a="cfe"
[root@myhost ~]# b="efr"
[root@myhost ~]# if [ "$a" =="$b" ]
> then 


############## end ####################################

if [ "$a" != "$b" ]
then
	echo "字符串a和字符串b不相等"
else
	echo "字符串a和字符串b相等"
fi

if [ -z "$a" ]
then
	echo "字符串a的长度为0,即字符串a为空?"
else
	echo "字符串a的长度不为0"
fi 

if [ -n "$a" ]
then
	echo "字符串a的长度不为0"
else
	echo "字符串a的长度为0,即字符串a为空?"
fi

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

运行结果:

字符串a和字符串b不相等
字符串a的长度不为0
字符串a的长度不为0
字符串a不为空

文件测试运算符
文件测试运算符包括:

操作符 说明 举例
-b 检测文件是否是块设备文件,如果是,则返回true [ -b $file ] 返回true
-c 检测文件是否是字符设备文件,如果是,则返回true [ -c $file ] 返回true
-d 检测文件是否是目录文件,如果是,则返回true [ -d $file ] 返回true
-f 检测文件是否是普通文件(既不是目录也不是设备文件),如果是,则返回true [ -f $file ] 返回true
-g 检测文件是否设置了SGID位,如果是,则返回true [ -g $file ] 返回true
-k 检测文件是否设置了粘着位(stucky Bit),如果是,则返回true [ -k $file ] 返回true
-p 检测文件是否具名管道,如果是,则返回true [ -p $file ] 返回true
-u 检测文件是否设置了SUID位,如果是,则返回true [ -u $file ] 返回true
-r 检测文件是否可读,如果是,则返回true [ -r $file ] 返回true
-w 检测文件是否可写,如果是,则返回true [ -w $file ] 返回true
-x 检测文件是否可执行,如果是,则返回true [ -x $file ] 返回true
-s 检测文件是否为不为空(文件大小是否不为0),如果不为0,则返回true [ -s $file ] 返回true
-e 检测文件(包括目录)是否存在,如果存在,则返回true [ -e $file ] 返回true
-a 检测文件(包括目录)是否存在,如果存在,则返回true [ -e $file ] 返回true
文件测试运算符用于检测 Unix 文件的各种属性,-a已经被弃用了。

举例说明:

例如,变量 file 表示文件“ /etc/rc.d/rc.local”,它的大小为220kb,所有者root用户具有 rwx 权限。

[root@myhost ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x 1 root root 220 Oct  4  2017 /etc/rc.d/rc.local

下面的代码,将检测该文件的各种属性:

#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

file="/etc/rc.d/rc.local"

if [ -e $file ]
then
	echo "这个已经存在"
else
	echo "这个不存在"
fi


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 [ -d $file ]
then
	echo "这个是目录"
else	
	echo "这个不是目录"
fi

if [ -f $file ]
then
	echo "这个是普通文件"
else
	echo "这个不是普通文件"
fi

if [ -s $file ]
then
	echo "此文件大小不为0"
else
	echo "此文件大小为0,即文件内容为空"
fi

运行结果:

这个已经存在
当前用户可读此文件
当前用户可写此文件
当前用户可以执行此文件
这个不是目录
这个是普通文件
此文件大小不为0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章