Shell编程之条件语句

一、条件测试操作

        要使 Shell 脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等。
        Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常。使用专门的测试工具——test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。使用 test 测试命令时,包括以下两种形式。

test 条件表达式
[ 条件表达式 ]

        方括号“[”或”]”与条件表达式之间需要至少一个空格进行分隔。

1.文件测试

        文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即可。
        -d:测试是否为目录(Directory)。
        -e:测试目录或文件是否存在(Exist)。
        -f:测试是否为文件(File)。
        -r:测试当前用户是否有权限读取(Read)。
        -w:测试当前用户是否有权限写入(Write)。
        -x:测试是否设置有可执行(Excute)权限。r
        执行条件测试操作以后,通过预定义变量$?可以获得测试命令的返回状态值,从而判断该条件是否成立。例如,执行以下操作可测试目录/media/是否存在,如果返回值$?为0,表示存在此目录,否则表示不存在或者虽然存在但不是目录。

2.整数值比较

        整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。整数值比较的常用操作选项如下,使用时将操作选项放在要比较的两个整数之间。
        -eq:第一个数等于(Equal)第二个数。
        -ne:第一个数不等于(Not Equal)第二个数。
        -gt:第一个数大于(Greater Than)第二个数。
        -lt:第一个数小于(Lesser Than)第二个数。
        -le:第一个数小于或等于(Lesser or Equal)第二个数。
        -ge:第一个数大于或等于(Greater or Equal)第二个数。

3.字符串比较

        字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的Shel 脚本中,也可用来判断用户输入的位置参数是否符合要求。字符串比较的常用操作选项如下。
        =:第一个字符串与第二个字符串相同。
        !=:第一个字符串与第二个字符串不相同,其中“!"符号表示取反。
        -z:检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串。

4.逻辑测试

        逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况,需要有一个测试的过程。常用的逻辑测试操作如下,使用时放在不同的测试语句或命令之间。
         &&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为 0(结果成立)。使用 test 命令测试时,“&&”可改为“-a”。
        ||:逻辑或,表示“或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为 0(结果成立)。使用 test 命令测试时,“|”可改为“-o”。
        !:逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为0(结果成立)。

二、if语句的结构

        在 Shell脚本应用中,if语句是最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果.….那么……)。根据不同的复杂程度,if语句的选择结构可以分为三种基本类型,适用于不同的应用场合。

1.单分支if语句

if语句的“分支"指的是不同测试结果所对应的执行语句(一条或多条)。对于单分支的选择结构,只有在"条件成立”时才会执行相应的代码,否则不执行任何操作。单分支if语句的语法格式如下所示。

if 条件测试操作
then
    命令序列
fi

        在上述语句结构中,条件测试操作既可以是“[条件表达式]"语句,也可以是其他可执行的命令语句;命令序列指的是一条或多条可执行的命令行,也包括嵌套使用的 if 语句或其他流程控制语句。
        单分支if语句的执行流程:首先判断条件测试操作的结果,如果返回值为0,表示条件成立,执行 then 后面的命令序列,一直到遇见fi结束判断为止,继续执行其他脚本代码;如果返回值不为 0,则忽略 then 后面的命令序列,直接跳至f行以后执行其他脚本代码。

2.双分支if语句

        对于双分支的选择结构,要求针对"条件成立""条件不成立"两种情况分别执行不同的操作。

if 条件测试操作
then 
    命令序列1
else
    命令序列2
fi

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

3.多分支if语句

        由于if语句可以根据测试结果的成立、不成立分别执行操作,所以能够嵌套使用,进行多次判断。

if 条件测试操作1
then
    命令序列1
elif 条件测试操作2
then
    命令序列2
else
    命令序列3
fi

        上述语句结构中只嵌套了一个elif语句作为示例,实际上可以嵌套多个。if 语句的嵌套在编写 Shel 脚本时并不常用,因为多重嵌套容易使程序结构变得复杂。当确实需要使用多分支的程序结构时,采用下一节的 case 语句更加方便。

三、case分支语句

        case 语句可以使脚本程序的结构更加清晰、层次分明,本节就来学习 case 语句的语法结构及应用。

case语句的结构

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

case  变量值  in
模式 1)
    命令序列1
    ;;
模式 2)
    命令序列2
    ;;
    ......
*)
    默认命令序列
esac

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

        使用 case 分支语句时,有几个值得注意的特点如下所述。
        case 行尾必须为单词“in”,每一模式必须以右括号")”结束。
        双分号";;”表示命令序列的结束。
        模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“”表示或,如“A|B”。
        最后的“*)”表示默认模式,其中的*相当于通配符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值