目录
前言:she11编程作为Linux系统管理的重要组成部分,其强大的脚本处理能力为自动化任务提供了极大便利。在shel1脚本编写中,条件语句是不可或缺的逻辑控制结构,它们使得脚本能够根据不同的条件执行相应的操作,从而实现智能化和高效化。
本章节将详细介绍she11脚本中的条件测试操作和条件语句的使用。通过学习条件测试操作,读者可以掌握如何区分不同情况以确定执行何种操作,例如检査文件是否存在、比较整数值和字符串等。同时,本章节还将深入讲解if条件语句和case分支语的语法结构和应用示例,帮助读者在实际编程中灵活运用这些条件语句来构建层次分明、逻辑清晰的脚本程序。
一.条件测试操作
She11环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为时表示成功,否则(非。值)表示失败或异常。使用专门的测试工具-test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。
使用 test 测试命令时,包括以下两种形式:
test 条件测试 或 [ 条件表达式 ]
1.文件测试
文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即可。
少
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(write)
-x:测试是否设置有可执行(Excute)权限。
示例:测试是否为目录,$? 查看上一条命令状态,若测试的条件不成立,则测试操作的返回值将不为0(通常为1)。

也可以结合命令分隔符"&&"和echo命令一起使用,当条件成立时直接输出"YES"。其中,"&8"符号表示"而且"的关系,只有当前面的命令执行成功后才会执行后面的命令,否则后面的命令将会被忽略。例如,上述目录测试操作可以改写如下。

2.整数值比较
整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。
- -eq:第一个数等于(Equal)第二个数。
- -ne:第一个数不等于(NotEqual)第二个数。
- -gt:第一个数大于(GreaterThan)第二个数。
- -lt:第一个数小于(Lesser Than)第二个数。
- -le:第一个数小于或等于(Lesser or Equal)第二个数。
- -ge:第一个数大于或等于(GreaterorEqual)第二个数、
例如,若要判断当前已登录的用户数,当超过五个时输出"Too many.",可以执行以下操作。其中。已登录用户数可通过"who|wc-1"命令获得,以命令替换方式嵌入。

3.字符串比较
宇符申比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的She1l脚本中电可用来判断用户输入的位置参数是否符合要求。字符串比较的常用操作选项如下。
- =:第一个字符串与第二个字符串相同。
- !=:第一个字符串与第二个字符串不相同,其中"!"符号表示取反。
- -z:检查字特串是否为空(Zero),对于未定义或赋予空值的变量将视为空串。
例如。若要判断当前系统的语言环境,当发现不是"en.us"时输出提示信息"Noten.Us",可以行以下操作。
查看当前语言环境

字符串测试结果:不等于

4.逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况,需要有一个测试的过程。常用的逻辑测试操作如下便翔时放在不同的测试语句或命令之间。
- &&:逻辑与、表示"而且",只有当前后两个条件都成立时,整个测试命令的返回值才为(结果成立)。使用test 命令测试时,"&&"可改为"-a"。
- ||:逻辑或,表示"或者",只要前后两个条件中有一个成立,整个测试命令的返回值即为0(结果成立)。使用test 命令测试时,"||"可改为"-o"。
- !:逻辑否,表示"不",只有当指定的条件不成窳时,整个测试命令的返回值才为0(结果成立)。
在上述逻辑测试的操作选项中,"&8"和"|"通常也用于间隔不同的命令操作,其作用是相似的。实际上此前已经接触过"88"操作的应用,如"make&&make instal1"的编译安装操作。
例如,若要判断当前Linux系统的内核版本是否大于3.4,可以执行以下操作。其中,内核版本号通址uname和awk令得。
查看内核版本信息
取主,次版本号
进行逻辑测试
二:if条件语句
1.if语句的结构
在shell脚本应用中,if语句是最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果...那么...)。根据不同的复杂程度,if语句的选择结构可以分为三种基本类型,适用于不同的应用场合。
(1)单分支if语句
If语句的"分支"指的是不同测试结果所对应的执行语句(一条或多条)。对于单分支的选择结构,具有在"条件成室"时才会执行相应的代码,否则不执行任何操作。单分支if语句的语法格式如下所示:

单分支if语句的执行流程:首先判断条件测试操作的结果,如果返回值为0,表示条件成立,执行then 后面的命令序列,一直到遇见fi结束判断为止,继续执行其他脚本代码;如果返回值不为0,则忽略then 后面的命令序列,直接跳至fi行以后执行其他脚本代码,如下图所示。

(2)双分支if语句
对于千双分支的选择结构,要求针对"条成立""条件不成立"两种情况分别执行不同的操作。双分支if语包的法格式如下所示:

双分支if语句的执行流程:首先判断条件测试操作的结果,如果条件成立,则执行then后面的命令序列1,忽略else及后面的命令序列2,直到遇见fi结束判断;如果条件不成立,则忽略then及后面的命令序列1,直接跳至else后面的命令序列2并执行,直到遇见fi结束判断,如下图所示:

(3)多分支if语句

多分支1f语句的执行流程:首先判断条件测试操作1的结果,如果条件1成立,则执行命令序列1,然后跳至fi结束判断;如果条件1不成立,则继续判断条件测试操作2的结果,如果条件2成立则执行命令序列2,然后跳至 fi结束判断......如果所有的条件都不满足,则执行 else 后面的命令序列n,直到遇见fi结束判断,如下图所示。

2.if语句应用示例
(1)单分支if语句应用
很多 Linux用户习惯上将光盘设备挂载到/media/cdrom目录下,但Linux 系统默认并没有建立此目录。若需要在She11脚本中执行挂载光盘的操作,建议先判断挂载点目录是否存在,若不存在则新建此目录。


添加权限,执行该文件

(2)双分支if语句应用
双分支F语句只是在单分支的基础上针对"条件不成立"的情况执行另一种操作,而不是"坐视不管"地不执行任何操作。例如,若要编写一个连通性测试脚本pinghost.sh,通过位置参数$1提供目标主机地址,然后根据ping检测结果给出相应的提示,可以参考以下操作过程。


在土述脚本代码中,为了提高 ping 命令的测试效率,使用了"-c""-i""-W"选项,分别指定只发送三个测试包、问隔0.2秒、超时3秒。另外,通过"&>/dev/nu1l"屏蔽了 ping 命令执行过程的编出信息。执行pinghost,sh本的效果如下所所示:

(3)多分支if语句应用


测试结果如下

三:case分支语句
1.case语句的结构
case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。
case分支语句的语法结构如下所示:

在上述语句结构中,关键字case后面跟的是"变量值",即"$变量名"。整个分支结构包括在case..esac 之间,中间的模式1、模式 2、......、*对应为变量的不同取值(程序期望的取值),其中*作为通配符,可匹配任意值。

使用case分支语句时,注意:
- case行尾必须为单词"in",每一模式必须以有括号")"结束。
- 双分号";;"表示命令序列的结束。
- 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以用竖杠符号"」"表示上或,如"AIB"。
- 最后的"*)"表示默认模式,其中的*相当于通配符。
2.case语句应用示例
(1) 检查用户输入的字符类型
提示用户从键盘输入一个字符,通过case语句判断该字符是否为字母、数字或者其他控制字符,并给出相应的提示信息。

执行效果如下

(2)编写系统脚本服务
编写一个名为myprog的系统服务脚本,通过位置变量$1指定的start、stop、restart、status控制参数,分别用来启动、停止、重启sleep进程,以及查看sleep进程的状态。其中,命令sleep 用来暂停指定秒数的时间,这里仅用做测试,在实际运维工作中应将sleep改为相应后台服务的控制命令序列。

测试结果如下:

在Linux系统中,源码软件包编译安装后提供的服务控制脚本使用了case分支语句;也有一些源码包没有提供服务控制脚本,编译安装后可参照上例自行编写服务控制脚本。平时控制各种系统服务时,供的 start、stop、restart等位置参数,正是由case语结构来识别并完成相应操作的。