#Linux# #shell编程# #编程##shell#

在上一篇:带你了解企业是如何编写脚本的-入门篇:抛弃vi,拥抱echo 中,我们知道了可以通过echo这个工具可以写入和打印一些信息,打印完成之后就直接进行下一步,一切看起来是那么的顺利。

但是,你的脚本真的能那么顺利吗?我们要如何正确的完成目标?这时候就需要我们的if判断上场了!

本文以bash语法进行演示

Shell条件选择

Shell和其它编程语言一样,支持选择结构,并且有两种形式,分别是 if else 语句和 case in 语句。在这里我们就先从最简单的if语句开始学习。




脚本的echo怎么在ADB现实 adb脚本语言_脚本的echo怎么在ADB现实

编程语言



简单案例

if中文翻译过来就是:如果 。 所以if的应用场景主要在于确定某个变量是否等于预设值,如果等于某个预设值则执行哪些操作,例如下面的案例:

#!/bin/bash##if判断echo -e "请输入一个菜单的序号:[1]查询本机IP地址[2]查询本机主机名"read showif [[ "$show" -eq '1' ]];thenhostname -Ielif [[ "$show" -eq "2" ]];thenhostnamefi




脚本的echo怎么在ADB现实 adb脚本语言_Shell_02

执行结果



然后可以看到,此时的程序可以根据我的选择去执行对应的操作,这就是if语句的一个应用场景(只建议条件少的情况使用if)

语法解析

看完了案例,我们就可以回到最基础的语法这里。每个编程语言都有不同的语法,而学习编程最基础的其实就是学习语法,只有掌握了语法你才能更高效的学习。

下面我们来对比一下Python和Shell的if语法:

Shell编程的if基本语法

在Shell编程中,if语句最简单的结构就是:

if [[ "判断" ]];then"操作"fi

而这个最简单同时也意味着这是必不可少的,例如下面这个案例:




脚本的echo怎么在ADB现实 adb脚本语言_adb脚本选择语句_03

简单案例



如果我把结尾的fi去掉会是怎样的呢?




脚本的echo怎么在ADB现实 adb脚本语言_应用场景_04

去掉fi



或者去掉:then




脚本的echo怎么在ADB现实 adb脚本语言_adb脚本选择语句_05

去掉then



可以看到,无论去掉哪一部分都是报错的,但是可以这样修改:




脚本的echo怎么在ADB现实 adb脚本语言_Shell_06

改为单方括号




脚本的echo怎么在ADB现实 adb脚本语言_adb脚本选择语句_07

删除变量双引号



可以看到,此时虽然修改了一些地方,但是运行起来还是没有问题的。

Shell脚本的if判断语句格式

在Shell脚本中,其实对编程格式是非常的随意的,不像Python那样严格的限制缩进,例如:




脚本的echo怎么在ADB现实 adb脚本语言_应用场景_08

执行命令与判断在同一行




脚本的echo怎么在ADB现实 adb脚本语言_Python_09

全部在同一行(需要加一个分号 ; )



虽然说这样都没有问题,但是我个人还是建议参照Python的语法要求来编写,因为按照Python那样的格式要求的话看起来会比较方便,尤其是判断条件多的时候就不会显得乱七八糟的。

Shell编程的if扩展语法

在实际的场景中,我们不可能永远只判断一个条件,而且实际条件也不可能全部都在预期之中,所以下面分别介绍多条件与预期之外的场景语法:

多条件场景

多条件场景也就是说在实际的结果中,会存在很多种不同的结果,然后每种结果都在预期内

语法如下:

if [[ "$变量" -eq '1值' ]];thenhostname -Ielif [[ "$变量" -eq "2值" ]];thenhostname elif [[ "$变量" -eq "N值" ]];thenfi

也就是说,有多少个判断添加就加多少个:

elif [[ "$变量" -eq "N值" ]];then

只需要最后有fi结尾即可,但是个人建议如果不考虑预期之外的情况,且判断添加多的话使用case语句会更简洁!

案例如下:




脚本的echo怎么在ADB现实 adb脚本语言_adb脚本选择语句_10

预期之内



这样的写法本人非常不推荐,无论是易用性还是严谨性,都不建议使用这种写法

多条件+预期之外(默认设置)

相对于上一个场景而言,明显有时候只考虑预期之内的结果是不明智的,所以我们就需要考虑预期之外,也就是:else分支

语法如下:

if [[ "$变量" -eq '1值' ]];thenhostname -Ielif [[ "$变量" -eq "2值" ]];thenhostnameelif [[ "$变量" -eq "N值" ]];then hostelse    echo '选择错误'exit 1fi

else常用于设置:默认值,例如拿上面的案例来改进:




脚本的echo怎么在ADB现实 adb脚本语言_Shell_11

通过else设置默认值



从结果中可以看到,即使我乱选择或者不选择,程序都会帮我选择一个默认值,这种一般可以用在不是非常重要的选择但是也不能空白的场景。

相对于上一个语法而言,这种写法就考虑更加全面。在一些非常严谨的场景下,我们还还可以通过else设置选择错误就退出的一种处理机制(更加严谨)




脚本的echo怎么在ADB现实 adb脚本语言_adb脚本选择语句_12

必须选择



主要应用场景

状态检查

虽然说if是条件分支、判断语句,但是对于选择分支而言,其实case更适合做这行,而if更多的应用场景则是判断执行状态,例如:




脚本的echo怎么在ADB现实 adb脚本语言_Shell_13


脚本的echo怎么在ADB现实 adb脚本语言_Shell_14


文件/文件夹判断

由于在脚本中还会考虑对某些文件夹/文件进行操作,所以我们需要正确的判断想要操作/编辑的文件/文件夹是否存在才能更好的去实现最终目标,所以这时候就可以使用if判断文件或者文件夹是否存在了


脚本的echo怎么在ADB现实 adb脚本语言_adb脚本选择语句_15

判断文件是否存在


脚本的echo怎么在ADB现实 adb脚本语言_应用场景_16

判断文件夹是否存在


你认为if还可以在哪些场景更适合使用或者哪些工具更适合替代以上场景呢?可以在评论区一起讨论一下。