Unix 简明教程
Unix / Linux - Shell Basic Operators
每个 shell 都支持各种运算符。我们将在本章详细讨论 Bourne shell(默认 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。
-
完整的表达式应包含在 ‘ ‘ 之间,称为反引号。
Arithmetic Operators
Bourne Shell 支持以下算术运算符。
假设变量 a 为 10,变量 b 为 20,那么 -
Operator |
Description |
Example |
+ (Addition) |
添加运算符两侧的值 |
|
- (Subtraction) |
从左操作数中减去右操作数 |
|
* (Multiplication) |
乘以运算符两侧的值 |
|
/ (Division) |
将左操作数除以右操作数 |
|
% (Modulus) |
将左手操作数除以右手操作数,并返回余数 |
|
= (Assignment) |
将右操作符赋值给左操作符 |
a = $b 会将 b 的值赋值给 a |
== (Equality) |
对比两个数字,如果二者相同则返回 true。 |
[ $a == $b ] 会返回 false。 |
!= (Not Equality) |
对比两个数字,如果二者不同则返回 true。 |
[ $a != $b ] 会返回 true。 |
了解到所有条件表达式都应位于带空格的方括号当中非常重要,例如 [ $a == $b ] 是正确的,而 [$a==$b] 是不正确的。
所有算术运算都使用长整数进行。
Relational Operators
Bourne Shell 支持以下特定于数值的关联运算符。这些运算符不适用于字符串值,除非其值为数值。
例如,以下运算符将用于检查 10 和 20 之间的关系以及 "10" 和 "20" 之间的关系,但不用于检查 "ten" 和 "twenty" 之间的关系。
假设变量 a 为 10,变量 b 为 20,那么 -
Operator |
Description |
Example |
-eq |
检查两个操作数的值是否相等;如果相等,则条件为 true。 |
[ $a -eq $b ] 不为 true。 |
-ne |
检查两个操作数的值是否相等;如果值不相等,则条件为 true。 |
[ $a -ne $b ] 为 true。 |
-gt |
检查左操作数的值是否大于右操作数的值;如果是,则条件变为 true。 |
[ $a -gt $b ] 不为 true。 |
-lt |
检查左操作数的值是否小于右操作数的值;如果是,则条件变为 true。 |
[ $a -lt $b ] 为 true。 |
-ge |
检查左操作数的值是否大于或等于右操作数的值;如果是,则条件变为 true。 |
[ $a -ge $b ] 为假。 |
-le |
检查左操作数的值是否小于或等于右操作数的值;如果是,则条件变为 true。 |
[ $a -le $b ] 为真。 |
了解所有条件表达式都应放在方括号中且周围带有空格非常重要。例如, [ $a ⇐ $b ] 正确,而 [$a ⇐ $b] 错误。
Boolean Operators
Bourne Shell 支持以下布尔运算符。
假设变量 a 为 10,变量 b 为 20,那么 -
Operator |
Description |
Example |
! |
这是逻辑否定。这会将真条件反转为假,反之亦然。 |
[ ! false ] 为真。 |
-o |
这是逻辑 OR 。如果其中一个操作数为真,则条件变为真。 |
[ $a -lt 20 -o $b -gt 100 ] 为真。 |
-a |
这是逻辑 AND 。如果两个操作数都为真,则条件变为真,否则为假。 |
[ $a -lt 20 -a $b -gt 100 ] 为假。 |
String Operators
Bourne Shell 支持以下字符串运算符。
假设 a 变量保存了“abc”, b 变量保存了“efg”,则 −
Operator |
Description |
Example |
= |
检查两个操作数的值是否相等;如果相等,则条件为 true。 |
[ $a = $b ] 为假。 |
!= |
检查两个操作数的值是否相等;如果值不相等,则条件变为真。 |
[ $a != $b ] 为真。 |
-z |
检查给定的字符串操作数大小是否为零;如果长度为零,则返回真。 |
[ -z $a ] 为假。 |
-n |
检查给定字符串操作数大小是否非零;如果长度不为零,则返回真。 |
[ -n $a ] 非假。 |
str |
检查 str 是否不是空字符串;如果是空字符串,则返回假。 |
[ $a ] 非假。 |
File Test Operators
我们有几个运算符,可用于测试与 Unix 文件关联的各种属性。
假设变量 file 保存现有文件名“test”,其大小为 100 字节,对 − 的权限为 read 、 write 和 execute
Operator |
Description |
Example |
-b file |
检查文件是否为块特殊文件;如果是,则条件变为真。 |
[ -b $file ] 为假。 |
-c file |
检查文件是否为字符特殊文件;如果是,则条件变为真。 |
[ -c $file ] 为假。 |
-d file |
检查文件是否为目录;如果是,则条件变为真。 |
[ -d $file ] 非真。 |
-f file |
检查文件是否为普通文件,而不是目录或特殊文件;如果是,则条件变为真。 |
[ -f $file ] 为真。 |
-g file |
检查文件是否设置了其 set 组 ID (SGID) 位;如果是,则条件变为真。 |
[ -g $file ] 为假。 |
-k file |
检查文件是否设置了其粘滞位;如果是,则条件变为真。 |
[ -k $file ] 为假。 |
-p file |
检查文件是否为有名管道;如果是,则条件变为真。 |
[ -p $file ] 为假。 |
-t file |
检查文件描述符是否已打开并与终端关联;如果是,则条件变为真。 |
[ -t $file ] 为假。 |
-u file |
检查文件是否设置了设置用户 ID (SUID) 位;如果是,则条件变为真。 |
[ -u $file ] 为假。 |
-r file |
检查文件是否可读;如果是,则条件变为真。 |
[ -r $file ] 为真。 |
-w file |
检查文件是否可写;如果是,则条件变为真。 |
[ -w $file ] 为真。 |
-x file |
检查文件是否可执行;如果是,则条件变为真。 |
[ -x $file ] 为真。 |
-s file |
检查文件的大小是否大于 0;如果是,则条件变为真。 |
[ -s $file ] 为真。 |
-e file |
检查文件是否存在;即使文件是目录但存在,也是真的。 |
[ -e $file ] 为真。 |