Linux shell编程(shell基本操作符和条件语句介绍和用法)

上一章Linux shell编程请查看: shell数组定义和操作
这一章我们开始讨论shell的基本操作符和条件语句,这些都是shell编程的基本元素。
一、shell基本操作符每种shell都支持不同的操作符,我们这里将详细讨论Bourne shell(默认shell)。我们现在讨论以下的操作符:

  • 算术运算符
  • 关系运算符
  • 布尔操作符
  • 字符串运算符
Bourne shell最初没有任何机制来执行简单的算术运算,但它使用外部程序awk或expr。下面的例子说明了如何将两个数相加:
#!/bin/bash value=http://www.srcmini.com/`expr 1 + 9` echo"total value: $value"

在进行加法运算时需要考虑以下几点:
  • 运算符和表达式之间必须有空格,例如2+2是不正确的而应该写成2 + 2。
  • 完整的表达式应该包含在’ ‘ 之间称为反引号。
1、算术运算符
下列算术运算符由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 would 将b的值分配给a
== (相等) 比较两个数字,如果两个数字相同则返回true。 [ $a == $b ] 返回false
!= (不等) 比较两个数字,如果两者不同则返回true。 [ $a != $b ] 返回true
理解所有的条件表达式都应该在方括号内并在它们周围加空格是非常重要的,例如[ $a == $b ]是正确的,而[$a==$b]是错误的,所有的算术计算都是用长整数来完成的。
2、关系元算符
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 ] 不为true
-le 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 [ $a -le $b ] 返回true
重要的是要理解所有的条件表达式都应该放在方括号中,并在它们周围加上空格,例如[ $a < = $b ]是正确的而[$a < = $b]是错误的。
3、布尔操作符
Bourne Shell支持以下布尔操作符(假设变量a=10,变量b=20)
操作符 描述 例子
! 逻辑否定:将真条件转化为假条件,反之亦然。 [ ! false ] 返回true
-o 逻辑或:如果其中一个操作数为真,则条件为真。 [ $a -lt 20 -o $b -gt 100 ]返回true
-a 这是逻辑与:如果两个操作数都为真,则条件为真,否则为假。 [ $a -lt 20 -a $b -gt 100 ]返回false
4、文件测试操作符
我们有一些操作符可以用来测试与Unix文件相关的各种属性,假设一个变量file拥有一个现有文件名“test”,它的大小为100字节,并且具有读、写和执行权限。
操作符 描述 例子
-b file 检查文件是否是块特殊文件,如果是则条件为真。 [ -b $file ]返回false
-c file 检查文件是否是字符专用文件,如果是则条件为真。 [ -c $file ] 返回false.
-d file 检查文件是否为目录,如果是则条件为真。 [ -d $file ] 不为true
-f file 检查文件是否是普通文件,而不是目录或特殊文件,如果是则条件为真。 [ -f $file ] 返回true
-g file 检查文件是否设置了它的组ID (SGID)位,如果是则条件为真。 [ -g $file ] 返回false.
-k file 检查文件是否有粘位设置,如果是则条件为真。 [ -k $file ] 返回false.
-p file 检查文件是否是命名管道,如果是则条件为真。 [ -p $file ] 返回false.
-t file 检查文件描述符是否打开并与终端相关联,如果是则条件为真。 [ -t $file ] 返回false.
-u file 检查文件是否设置了用户ID (SUID)位,如果是则条件为真。 [ -u $file ] 返回false.
-r file 检查文件是否可读,如果是则条件为真。 [ -r $file ] 返回true
-w file 检查文件是否可写,如果是则条件为真。 [ -w $file ] 返回true
-x file 检查文件是否可执行,如果是则条件为真。 [ -x $file ] 返回true
-s file 检查文件大小是否大于0,如果是则条件为真。 [ -s $file ] 返回true
-e file 检查文件是否存在,即使文件是一个目录但存在。 [ -e $file ] 返回true
二、shell条件语句下面我们将了解Unix中的shell条件决策,在编写shell脚本时,可能会出现需要从给定的两条路径中采用一条路径的情况,因此我们需要使用条件语句来允许程序做出正确的决策并执行正确的操作。
Unix Shell支持条件语句,用于根据不同的条件执行不同的操作,现在我们来理解两个条件语句:if……else语句和case…esac语句。
1、if…else语句
If else语句是有用的决策语句,可以用来从给定的一组选项中选择一个选项,Unix Shell支持以下形式的if else语句:
  • if…fi语句
  • if…else…fi语句
  • if…elif…else…fi语句
大多数if语句使用上面讨论的基本关系运算符来检查关系。
2、case…esac语句
你可以使用多个if…elif执行多路分支的语句,然而这并不总是最好的解决方案,特别是当所有分支都依赖于单个变量的值时。
【Linux shell编程(shell基本操作符和条件语句介绍和用法)】Unix Shell支持case…esac语句,Unix shell中的esac语句与switch非常相似,我们在其他编程语言中也有case语句,如C或c++和PERL等。

    推荐阅读