7 - Shell_条件操作测试及if语句
要使Shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%发送警告;当备份目录不存在时能够自动创建;当源码编译程序的配置失败则不再继续安装等。
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败。
使用专门的测试工具—test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值0为成立)
使用test命令的两种形式
A:test 条件表达式
B:[ 条件表达式 ]
以上两种方法的作用完全一样,后者为常用。但后者需要注意方括号“[”、“]”与条件表达式之间至少有一个空格。
1. 文件测试
文件测试指的是根据给的路径,判断对应的是文件还是目标,或者判断文件是否有可读可写、可执行等权限。常见操作如下:
执行条件测试操作以后,通过预定义变量“$?”可以获得测试命令的返回状态,从而判断该条件是否成立。
例如:一下操作判断/media/cdrom/目录是否存在,返回值为1成立。
若测试条件不存在,则测试返回值将不为0(通常为1),如图所示:
2. 整数值比较
主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于、小于、等于第二个数。常见选项如下:
整数值比较在Shell脚本应用中比较多。例如:判断已登录用户数量、开启进程数、磁盘使用率是否超标,以及软件版本是否符合要求。实际使用时,往往会通过变量引用,命令替换等方式来获取一个值。
例如:若要判断当前已登录的用户数,当超过五个时输出“Too may”,可以执行以下语句。其中,已登录用户数可以通过“who | wc -l”查询,以命令替换方式进行。
0
再例如:若要判断当前可用内存(buffers/cache)大小,当低于2048MB时输出具体值,可以执行以下操作。其中“free -m”命令以MB单位输出内存信息。
3. 字符串比较
通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的Shell脚本中,也可用来判断用户输入的位置是否符合要求,常见选项如下:
例如:判断当前系统的语言环境,当发现不是“en.US”时输出提示信息“Not en.US”:
再例如:在Shell脚本中,经常需要用户输入“yes”或“no”来确认某个任务,一下操作展示了确认交互的过程,当然,实际使用时还会根据变量“ACK”的取值分别执行进一步的操作。
4. 逻辑测试
是判断两个或多个条件之间的依赖关系,当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或只要有其中一个成立等情况,需要有一个测试的过程。常用选项如下:
&&:逻辑与,表示“而且”,只有前后两个条件都成立时,整个测试命令的返回值才为0。使用test命令时,“&&”可改为“-a”
||:逻辑或,表示“或者”,只有前后两个条件中一个成立,整个测试命令的返回值才为0。使用test命令时,“||”可改为“-o”
!:逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为0。
“&&”、“||”通常也用于间隔不同的命令操作,其作用是相似得。
例如:若要判断当前Linux系统的内核版本是否大于2.4,可以执行以下操作。
使用if条件语句
在Shell脚本中,if语句是最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果……那么……)
1. 单分之的if语句
if语句的“分支”指的是不同测试结果所对应的执行语句(一条或多条)。对于单分支选择结构,只有在“条件测试成立”时才会执行相应的“命令序列”,否则不执行任何操作,单分支结构如下:
在上述语句结构中,条件测试操作即“[ 条件表达式 ]”语句,也可以是其他可执行的命令句;命令序列指的是一条或多条可执行的命令行,也包括嵌套使用的if语句或其他流程控制语句。
单分支的执行流程:首先判断条件测试语句的结果,返回值为0,表示条件成立,则执行then后面的命令序列,一直遇见fi结束判断为止,继续执行其他脚本代码;返回值为其他,则忽略then后面的命令序列,直接跳至fi以后执行其他脚本代码。
案例:
2. 双分支的if语句
对于双分支结构,要求针对“条件成立”、“条件不成立”两种情况分别执行不同命令序列。
双分支if语句的执行流程:首先判断条件测试操作的结果,如果成立,则执行then后的命令序列1,忽略else后的命令序列2,直到遇见fi结束判断;若不成立,则忽略then及后面的命令序列1,直接跳至else后面的命令序列2,直到遇见fi结束判断。
案例:
3. 多分支的if语句
由于if语句可以根据测试结果的成立,不成立分别执行操作,所以能够嵌套使用,进行多次判断。例如:首先判断某学生的得分是否几个,若几个则再次判断是否高于90分等,格式如下:
案例:
转载于:https://blog.51cto.com/wanggaoli/1708574