每个外壳支持多种操作,这章我们讨论 Bourne shell 支持的一些操作。
将讨论以下操作及其操作语法:
Arithmetic Operators (算术操作)
Relational Operators (关系操作)
Boolean Operators (布尔操作)
String Operators (字符串操作)
File Test Operators (文件测试相关操作)
Bourne shell 原生不具备支持简单算术运算的机制,但可以通过外部程序达到完成相同任务的需要,如 awk 或 expr 。
下面的简单例子演示如何两数相加的方法:
#!/bin/sh
val=`expr 2 + 2`
echo "Total value : $val"
运行如上脚本将得到如下输出:
Total value : 4
以下2点需要注意:
操作符和表达式及各元素间必须用空格分隔。例如: 「2+2」 的表示是不正确的,应写成 「2 + 2」 。
整个表达式应被反单引号 (`)括住。
算数运算符
Bourne Shell 支持以下算数运算符。
先假设变量 a 的值是 10 ,变量b 的值是 20
运算符
说明
例子+ (加号)
将运算符两边的值相加
表达式 $a + $b 得到的结果是 30
- (减号)
用减号左边的值减去减号右边的值
表达式 $a - $b 得到的结果是 -10
* (乘法)
乘号左右两边的值相乘
表达式 $a * $b 得到的结果是 200
/ (除法)
用除号左边的数除以右边的数
表达式 $b / $a 得到的结果是 2
% (取余)
将左边的数除以右边的数得到的余数
expr $b % $a 得到的结果是 0
= (赋值)
将右边的值赋值给左边的变量
a = $b 会将 b 的值赋给 a
== (等于)
判断两个变量是否相等,如果相等则返回 true
[ $a == $b ] 将返回 false
!= (不相等)
判断两个变量是否不相等,如果不相等则返回 true.
[ $a != $b ] 将返回 true
有一个很重要的细节要注意的是:所有条件表达式都应放在方括号内并在其要注意运算符与变量之间的空格。例如[$a == $b] 是正确的,而 [$a==$b] 是不正确的。
所有的算数运算的变量类型都是长整型
关系运算符
Bourne Shell 支持以下特性类型的关系运算符。这些关系型运算符不支持值类型是字符串的,除非这个字符串的内容是数字。
例如,下面的操作是检查数字 10 和 20 之间的关系,而不是检查字母 ten 和 twenty 的关系。
假设,变量a 的值是 10,变量b 的值是20,
操作
描述
例子-eq
检测被操作的两个数是否相等,如果相等,则返回 true
[ $a -eq $b ] 返回的是 false
-ne
检测被操作的两个数是否相等,如果不相等,则返回 true
[ $a -ne $b ] 返回的是 true
-gt
检测左边被操作的数是否大于右边的操作数,如果是,则返回 true
[ $a -gt $b ] 返回的是 false
-lt
检测左边被操作的数是否小于右边的操作数,如果是,则返回 true
[ $a -lt $b ] 返回的是 true
-ge
检测左边被操作的数是否大于或者等于右边的操作数,如果是,则返回 true
[ $a -ge $b ] 返回的是 false
-le
检测左边被操作的数是否小于或者等于右边的操作数,如果是,则返回 true
[ $a -le $b ] 返回的是 true
有一个很重要的细节要注意的是:所有条件表达式都应放在方括号内并在其要注意运算符与变量之间的空格。例如 [ $a <= $b ] 是正确的,而 [$a <= $b] 是不正确的。
布尔运算符
Bourne Shell 支持以下布尔运算符。
假设,变量a的值是 10,变量b的值是 20.
运算符
描述
例子!
逻辑否,将为 true 的条件转为 false,反之亦然
[ ! false ] 返回 true
-o
逻辑或 or, 所有参与运算的条件中,只要有一个为 true,就返回 true
[ $a -lt 20 -o $b -gt 100 ] 返回 true
-a
逻辑与 and,所有参与运算的条件中,全部为 true,才返回 true
[ $a -lt 20 -a $b -gt 100 ] 返回 false
字符串运算符
Bourne Shell 支持以下字符串运算符。
假设变量a的值是 "abc",变量b的值是 "efg"
运算符
描述
例子=
判断 = 运算符两边的值是否相等,如果相等,返回 true
[ $a = $b ] 返回 false
!=
判断 != 运算符两边的值是否不相等,如果不相等,返回 true
[ $a != $b ] 返回 true
-z
判断字符串的长度是否为 0,如果是,返回 true
[ -z $a ] 返回 false
-n
判断字符串的长度是否不为 0,如果不为0,返回 true
[ -n $a ] 返回 true
str
检查是不是空字符串
[ $a ] 返回 true
文件测试操作符
有几个运算符可以用于测试 Unix 文件的各种属性。
假设现在有一个 file 的变量,它是一个叫做「test」的文件,其大小为 100 字节并且拥有可读可写可执行的权限。
操作
描述
例子-b file
若文件存在且是一个块特殊文件,则为真
[ -b $file ] 返回 false.
-c file
若文件存在且是一个字符特殊文件,则为真
[ -c $file ] 返回 false
-d file
若文件存在且是一个目录,则为真
[ -d $file ] 返回 false
-f file
若文件存在且为一个规则文件,则为真
[ -f $file ] 返回 true
-g file
若文件存在且设置了 SGID 位的值,则为真
[ -g $file ] 返回 true
-k file
若文件存在且设置了sticky 位的值,则为真
[ -k $file ] 返回 false
-p file
若文件存在且为一已命名管道,则为真
[ -p $file ] 返回 false
-t file
若文件存在且与终端关联,则为真
[ -t $file ] 返回 false
-u file
若文件存在且设置了SUID位的值,则为真
[ -u $file ] 返回 false
-r file
若文件存在且可读,则为真
[ -r $file ] 返回 read
-w file
若文件存在且可写,则为真
[ -w $file ] 返回 true
-x file
若文件存在且可执行,则为真
[ -x $file ] 返回 true
-s file
若文件存在且其大小大于零,则为真
[ -s $file ] 返回 true
-e file
若文件存在,则为真
[ -e $file ] 返回 true