#Linux# #shell编程# #编程##shell#
在上一篇:带你了解企业是如何编写脚本的-入门篇:抛弃vi,拥抱echo 中,我们知道了可以通过echo这个工具可以写入和打印一些信息,打印完成之后就直接进行下一步,一切看起来是那么的顺利。
但是,你的脚本真的能那么顺利吗?我们要如何正确的完成目标?这时候就需要我们的if判断上场了!
本文以bash语法进行演示
Shell条件选择
Shell和其它编程语言一样,支持选择结构,并且有两种形式,分别是 if else 语句和 case in 语句。在这里我们就先从最简单的if语句开始学习。
![53ac4b9cb485da1e2d96906409ef8ad8.png](https://i-blog.csdnimg.cn/blog_migrate/158a413233bea464329b15162423846c.jpeg)
编程语言
简单案例
if中文翻译过来就是:如果 。 所以if的应用场景主要在于确定某个变量是否等于预设值,如果等于某个预设值则执行哪些操作,例如下面的案例:
#!/bin/bash##if判断echo -e "请输入一个菜单的序号:[1]查询本机IP地址[2]查询本机主机名"read showif [[ "$show" -eq '1' ]];thenhostname -Ielif [[ "$show" -eq "2" ]];thenhostnamefi
![6bf17b29afc579bfb35892b7c452da33.png](https://i-blog.csdnimg.cn/blog_migrate/a31b37b21d2a1fd9898e5169fdf175ba.jpeg)
执行结果
然后可以看到,此时的程序可以根据我的选择去执行对应的操作,这就是if语句的一个应用场景(只建议条件少的情况使用if)
语法解析
看完了案例,我们就可以回到最基础的语法这里。每个编程语言都有不同的语法,而学习编程最基础的其实就是学习语法,只有掌握了语法你才能更高效的学习。
下面我们来对比一下Python和Shell的if语法:
Shell编程的if基本语法
在Shell编程中,if语句最简单的结构就是:
if [[ "判断" ]];then"操作"fi
而这个最简单同时也意味着这是必不可少的,例如下面这个案例:
![17e7da5fc5977fe9ebe0827ddf4fd4dc.png](https://i-blog.csdnimg.cn/blog_migrate/d480ef99a9f9aca2fbffdb1f7fa445a6.jpeg)
简单案例
如果我把结尾的fi去掉会是怎样的呢?
![ebc5a340250acff4d49e474f02a5f6a7.png](https://i-blog.csdnimg.cn/blog_migrate/c808544763d9beda9b7034ce89bd9f88.jpeg)
去掉fi
或者去掉:then
![7c4c5c43d06ad4b050d7816839eb1b08.png](https://i-blog.csdnimg.cn/blog_migrate/9c82663710fe200f5a133fbae1b382d1.jpeg)
去掉then
可以看到,无论去掉哪一部分都是报错的,但是可以这样修改:
![9bf2a46cd3fe69985af70847ef15d0cb.png](https://i-blog.csdnimg.cn/blog_migrate/a7d3e89d1e6db575b00486187cf47238.jpeg)
改为单方括号
![175e0ac13bfe28f93724279d4a91f3b0.png](https://i-blog.csdnimg.cn/blog_migrate/6d34aa8dd224dde4d9924be2c3cc0af2.jpeg)
删除变量双引号
可以看到,此时虽然修改了一些地方,但是运行起来还是没有问题的。
Shell脚本的if判断语句格式
在Shell脚本中,其实对编程格式是非常的随意的,不像Python那样严格的限制缩进,例如:
![0f79d54385ae634973bae113628b2f77.png](https://i-blog.csdnimg.cn/blog_migrate/3f4f77ea051eca4a6c8f23b0ae1808e0.jpeg)
执行命令与判断在同一行
![da38ff6e69479b2d49df491e8f66fa3a.png](https://i-blog.csdnimg.cn/blog_migrate/429d08c4c36273ee370476f91ccf966d.jpeg)
全部在同一行(需要加一个分号 ; )
虽然说这样都没有问题,但是我个人还是建议参照Python的语法要求来编写,因为按照Python那样的格式要求的话看起来会比较方便,尤其是判断条件多的时候就不会显得乱七八糟的。
Shell编程的if扩展语法
在实际的场景中,我们不可能永远只判断一个条件,而且实际条件也不可能全部都在预期之中,所以下面分别介绍多条件与预期之外的场景语法:
多条件场景
多条件场景也就是说在实际的结果中,会存在很多种不同的结果,然后每种结果都在预期内
语法如下:
if [[ "$变量" -eq '1值' ]];thenhostname -Ielif [[ "$变量" -eq "2值" ]];thenhostname elif [[ "$变量" -eq "N值" ]];thenfi
也就是说,有多少个判断添加就加多少个:
elif [[ "$变量" -eq "N值" ]];then
只需要最后有fi结尾即可,但是个人建议如果不考虑预期之外的情况,且判断添加多的话使用case语句会更简洁!
案例如下:
![a9b65df42e109a3786795bc794c28885.png](https://i-blog.csdnimg.cn/blog_migrate/f0d84d92ba401edf4de2b87fdafa00ca.jpeg)
预期之内
这样的写法本人非常不推荐,无论是易用性还是严谨性,都不建议使用这种写法
多条件+预期之外(默认设置)
相对于上一个场景而言,明显有时候只考虑预期之内的结果是不明智的,所以我们就需要考虑预期之外,也就是:else分支
语法如下:
if [[ "$变量" -eq '1值' ]];thenhostname -Ielif [[ "$变量" -eq "2值" ]];thenhostnameelif [[ "$变量" -eq "N值" ]];then hostelse echo '选择错误'exit 1fi
else常用于设置:默认值,例如拿上面的案例来改进:
![29feaf29acfe933e3ee3cbd188c26d3a.png](https://i-blog.csdnimg.cn/blog_migrate/2c5f7ec1d5ddea61ac36ba4a6ff161a0.jpeg)
通过else设置默认值
从结果中可以看到,即使我乱选择或者不选择,程序都会帮我选择一个默认值,这种一般可以用在不是非常重要的选择但是也不能空白的场景。
相对于上一个语法而言,这种写法就考虑更加全面。在一些非常严谨的场景下,我们还还可以通过else设置选择错误就退出的一种处理机制(更加严谨)
![695d8c98729dc9d4fd9c051975f7135e.png](https://i-blog.csdnimg.cn/blog_migrate/d9f3f4a62917ca731ef409dde00b49a5.jpeg)
必须选择
主要应用场景
状态检查
虽然说if是条件分支、判断语句,但是对于选择分支而言,其实case更适合做这行,而if更多的应用场景则是判断执行状态,例如:
![23896e1ef4340c2c88c7b4ad5b67dafc.png](https://i-blog.csdnimg.cn/blog_migrate/e5f9a6ab816dd9e46a4db5fac666b599.jpeg)
![b028273c40abb374e5b27b829d469a9d.png](https://i-blog.csdnimg.cn/blog_migrate/3353fd96315a86c236772aa2c7c37bd9.jpeg)
文件/文件夹判断
由于在脚本中还会考虑对某些文件夹/文件进行操作,所以我们需要正确的判断想要操作/编辑的文件/文件夹是否存在才能更好的去实现最终目标,所以这时候就可以使用if判断文件或者文件夹是否存在了
![ef1ddaa4eda5427b0c9c1706f3e74d0f.png](https://i-blog.csdnimg.cn/blog_migrate/388c3a229ef362b0935b0f0f8085f950.jpeg)
判断文件是否存在
![c937b651c40b9e029c339fb88c9470aa.png](https://i-blog.csdnimg.cn/blog_migrate/be1d2af5586dfbfe68720dbeaa526570.jpeg)
判断文件夹是否存在
你认为if还可以在哪些场景更适合使用或者哪些工具更适合替代以上场景呢?可以在评论区一起讨论一下。