表达式与运算符
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