每个shell支持各种运算符。我们将在本章中详细讨论Bourne shell(默认shell)。
我们现在将讨论以下运算符-
- 算术运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试操作
Bourne Shell最初没有执行简单算术运算的任何机制,但是它使用外部程序awk或expr。
以下示例显示如何将两个数字相加-
#!/bin/sh
val=`expr 2 + 2`
echo "Total value : $val"
上面的脚本将产生以下结果-
Total value : 4
添加时需要考虑以下几点-
- 运算符和表达式之间必须有空格。例如2+2是不正确的;它应该写为2 + 2。
- 完整的表达式应放在‘ ‘之间,称为反引号。
算术运算符
Bourne Shell支持以下算术运算符。
假设变量a持有10,变量b持有20,则-
运算符 | 描述 | 例 |
---|---|---|
+(加法) | 在运算符的任一侧添加值 | expr $a + $b 等于30 |
-(减法) | 从左操作数中减去右操作数 | expr $a - $b 会给出-10 |
*(乘法) | 将运算符两边的值相乘 | expr $a \* $b 会得到200 |
/(部门) | 将左操作数除以右操作数 | expr $b / $a 将得到2 |
%(模量) | 将左操作数除以右操作数并返回余数 | expr $b % $a 将给出0 |
=(分配) | 在左操作数中分配右操作数 | a = $b会将b的值赋给a |
==(平等) | 比较两个数字,如果两个相同,则返回true。 | [ $a == $b ]将返回false。 |
!=(不平等) | 比较两个数字,如果两者不同则返回true。 | [ $a != $b ]将返回true。 |
理解所有条件表达式都应该在方括号内且周围带有空格非常重要,例如** [ $a == $b ] 为真True,而[$a==$b]**是不正确的。
所有算术运算都是使用长整数完成的。
关系运算符
Bourne Shell支持以下特定于数值的关系运算符。这些运算符不适用于字符串值,除非它们的值是数字。
例如,以下运算符将检查10和20之间以及“10”和“20”之间的关系,而不是“十”和“二十”之间的关系。
假设变量a持有10,变量b持有20,则-
运算符 | 描述 | 例 |
---|---|---|
-eq | 检查两个操作数的值是否相等;如果是,则条件变为真。 | [$ a -eq $ b] 为False。 |
-ne | 检查两个操作数的值是否相等;如果值不相等,则条件为真。 | [$ a -ne $ b]为真True。 |
-gt | 检查左操作数的值是否大于右操作数的值;如果是,则条件变为真。 | [$ a -gt $ b]为假False。 |
-lt | 检查左操作数的值是否小于右操作数的值;如果是,则条件变为真。 | [$ a -lt $ b]为真True。 |
-ge | 检查左操作数的值是否大于或等于右操作数的值;如果是,则条件变为真。 | [$ a -ge $ b]为假False。 |
-le | 检查左操作数的值是否小于或等于右操作数的值;如果是,则条件变为真。 | [$ a -le $ b]为真True。 |
理解所有条件表达式都应放在方括号内并在其周围留有空格非常重要。例如,[ $a <= $b ]是正确的,而** [$a <= $b]**是错误的。
布尔运算符
Bourne Shell支持以下布尔运算符。
假设变量a持有10,变量b持有20,则-
运算符 | 描述 | 例 |
---|---|---|
! | 这是逻辑否定。这会将真实条件转化为错误,反之亦然。 | [!false]为真。 |
-o | 这是逻辑OR。如果操作数之一为true,则条件为true。 | [ $a -lt 20 -o $b -gt 100 ]为真True。 |
-一种 | 这是逻辑AND。如果两个操作数都为真,则条件为真,否则为假False。 | [ $a -lt 20 -a $b -gt 100 ]为假False。 |
字符串运算符
Bourne Shell支持以下字符串运算符。
假设变量a持有“ abc”,变量b持有“ efg”,则-
运算符 | 描述 | 例 |
---|---|---|
= | 检查两个操作数的值是否相等;如果是,则条件变为真。 | [ $a = $b ]为假False。 |
!= | 检查两个操作数的值是否相等;如果值不相等,则条件为真。 | [ $a != $b ]为真True。 |
-z | 检查给定的字符串操作数大小是否为零;如果长度为零,则返回true。 | [ -z $a ]为假False。 |
-n | 检查给定的字符串操作数大小是否为非零;如果长度非零,则返回true。 | [ -n $a ]不为假。 |
力量 | 检查str是否不是空字符串;如果为空,则返回false。 | [ $a ]不为假。 |
文件测试运算符
我们有一些运算符可用于测试与Unix文件相关的各种属性。
假设变量文件拥有一个现有文件名“ test”,其大小为100字节,并且具有对-的读取,写入和执行权限
运算符 | 描述 | 例 |
---|---|---|
-b 文件名 | 检查文件是否为块特殊文件;如果是,则条件变为真。 | [ -b $file ]为假False。 |
-c 文件名 | 检查文件是否是字符特殊文件;如果是,则条件变为真。 | [ -c $file ]为假False。 |
-d 文件名 | 检查文件是否为目录;如果是,则条件变为真。 | [ -d $file ]为假False。 |
-f 文件名 | 检查文件是否是普通文件,而不是目录或特殊文件;如果是,则条件变为真。 | [ -f $file ]为真True。 |
-g 文件名 | 检查文件的设置组ID(SGID)位是否已设置;如果是,则条件变为真。 | [ -g $file ]为假False。 |
-k 文件名 | 检查文件是否设置了粘性位;如果是,则条件变为真。 | [ -k $file ]为假False。 |
-p 文件名 | 检查文件是否为命名管道;如果是,则条件变为真。 | [ -p $file ]为假False。 |
-t 文件名 | 检查文件描述符是否打开并与终端关联;如果是,则条件变为真。 | [ -t $file ]为假False。 |
-u 文件名 | 检查文件是否设置了“设置用户ID(SUID)”;如果是,则条件变为真。 | [ -u $file ]为假False。 |
-r 文件名 | 检查文件是否可读;如果是,则条件变为真。 | [ -r $file ]为真True。 |
-w 文件名 | 检查文件是否可写;如果是,则条件变为真。 | [ -w $file ]为真True。 |
-x 文件名 | 检查文件是否可执行;如果是,则条件变为真。 | [ -x $file ]为真True。 |
-s 文件名 | 检查文件大小是否大于0;如果是,则条件为真。 | [ -s $file ]为真True。 |
-e 文件名 | 检查文件是否存在;即使文件是目录但存在也为true。 | [ -e $file ]为真True。 |