表达式与运算符

  bash支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

1、表达式

  bash的表达式可以分为算术表达式和逻辑表达式两种类型。

1、算术表达式

  数学运算涉及到表达式求值。bash自身并不支持简单的数学运算,但是可以awk和expr等命令来实现数学运算,其中expr最为常用,使用它能够完成表达式的求值操作。示例,将两个数相加,同时将运算结果表达出来

expr 5 + 3

  注意:操作数和运算符之间一定要有空格,否则expr会简单的将其当作字符串输出。

  当然,可以将计算的值用作变量,也可以将expr计算的结果赋值给变量。

n=1

m=5

expr $n + $m

val=`expr 2 + 2`

echo $val

 

  注意,完整的表达式要用反引号"`"括起来。

  更为简单的方式是使用$[]表达式进行数学计算,例如

val=$[5+3]
echo $val

  

这种形式不要求运算符和操作数之间有空格。

  还可以用let命令来计算整数表达式的值,如

n=1
m=5
let val=$n+$m
echo $val

  

2、逻辑表达式

   逻辑表达式主要用于条件判断,值为true(或为0)表示结果为真,值为false表示结果为假。

  通常使用test命令来判断表达式的真假。语法格式如下:

test 逻辑表达式

  例如以下语句用于比较两个字符串是否相等。

test "abc"="xyz"

  test命令更常用方括号"[]"代替。语法格式如下

[ 逻辑表达式 ]

   在使用左方括号而非test时,其后必须始终跟着一个空格、要评估的逻辑表达式、一个空格和右方括号,右方括号表示所需评估表达式的结束。逻辑表达式两边的空格是必需的,这表示调用test,以区别于同样经常使用方括号的字符、模式匹配操作。

  逻辑表达式判断表达式的结果,然后返回真假,通常和if、while或until命令结合使用,用于条件判断,以便对程序流进行广泛的控制。

2、算术运算符

  算术运算符用于数值计算,主要的算术运算符列表如下:

+:加法
-:减法
*:乘法
/:除法
%;取余值
=:赋值

  这里给出一个使用算术运算符的例子

#!/bin/bash
a=1
b=2
val=`expr $a + $b`
echo "a + b : $val"
#乘法(*)前面必须加转义符号反斜杠(\)才能实现乘法操作
val=`expr $a \* $b`
echo "a*b:$val"

  

3、整数关系运算符

   Shell支持整数比较,还需要使用整数关系运算符,列表如下:

-eq:相等,检测两个数是否相等,相等返回true
-ne:不等于。检测两个数是否相等,不相等返回true
-gt:大于。检测左边的数是否大于右边的,如果是,返回true
-lt:小于。检测左边的数是否小于右边的,如果是,返回true
-ge:大于等于
-le:小于等于

   下面是一个关系运算符的例子

#!/bin/bash

a=10

b=20

if [ $a -eq $b ]

then 

	echo "$a -eq $b :a等于b"

else

	echo "$a -eq $b:a不等于b"

fi

  

4、字符串检测运算符

  字符串运算符用于检测字符串,列表如下:

=:检测两个字符串是否相等,相等返回true。
!=:检测两个字符串是否相等,不相等返回true。
-z:检测字符串长度是否为0,为0返回true。
-n:检测字符串长度是否为0,不为0返回true。
str:检测字符串是否为空,不为空返回true。

  下面给出一个例子

#!/bin/bash
a="abc"
b="xyz"
if [ $a = $b ]
then 
	echo "$a = $b :a等于b"
else 
	echo "$a = $b :a不等于b"
fi
	if [ -z $a ]
then 
	echo "-z $a :字符串长度为0 "
else 
	echo "-z $a 字符串长度不为0 "
fi 
	if [ $a ]
then 
	echo "$a :字符串为非空"
else
	 echo "$a :字符串为空"
fi

 

5、文件测试运算符

  文件测试运算符用于检测文件的各种属性,以文件名为参数

-b:检测文件是不是块设备文件,如果是,则返回true。
-c:检测文件是不是字符设备文件,如果是,则返回true。
-d :检测文件是不是目录,如果是,则返回true。
-f:检测文件是不是普通文件,如果是,则返回true。
-g:检测文件是否设置了SGID位,如果是,则返回ture。
-k:检测文件是否设置了粘着位,如果是,则返回true。
-p:检测文件是不是具名管道,如果是,则返回,true。
-u:检测文件是是否设置了SUID位,如果是,则返回ture。
-r:检测文件是否刻度,如果是,则返回true。
-w:检测文件是否可写,如果是,则返回true。
-x :检测文件是否可执行,如果是,则返回true。
-s:检测文件是否为空,不为空则返回true。
-e:检测文件是否存在,如果是,则返回true。

  例如,下面的代码将检测/bin/bash的读写属性

#!/bin/bash
file="/bin/bash"
if [ -r $file ]
then 
  echo "文件具备读取权限"
else
  echo "文件不具备读取权限"
fi
if [ -w $file ]
  then 
  echo "文件具备写入权限"
else
  echo "文件不具备写入权限"
fi

6、布尔运算符

  布尔运算符用于对一个或多个逻辑表达式执行逻辑运算,结果为true或为false。通常用来对多个条件进行判断。有与、或、非3个运算符。

  -a:与运算。两个条件都为true才返回true。

  -o:或运算。有一个表达式为true就返回true。

  !:非运算。表达式为true,则返回false,否则返回true。

这里给出一个示例:

#!/bin/bash

a=5

b=10

if [ $a -lt 10 -a $b -gt 15 ]

   then 

	echo "两个条件都满足"

else 

	echo "两个条件都不满足"

fi

  

 

posted @ 2018-04-16 20:50  noticeable  阅读(350)  评论(0编辑  收藏  举报