Shell脚本学习笔记——语法之条件测试(2)
在上一篇博客中,我们讲述了一些条件测试最基本的方法。但是,上篇博客的若干条件判断命令,只能判断出条件的真假,但在实际的应用中,判断出真假只是第一步,我们还要根据判断结果来进行语句分流。
和C语言类似,在Shell中用if、then、elif、else、fi这几条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell命令组成的。
我们先来看一个例子:
这段代码是判断标准输入是否为字符串“hello”,若是则输出“hello...”;若不是则什么也不输出。
如果两条命令写在同一行则需要用 ;号隔开,一行只写一条命令就不需要写 ;号了。另外,then后面有换行,但这条命令没有写完,Shell会自动续行把下一行接在then后面当做一条命令处理。
和 [ 命令一样,要注意命令和各参数之间必须用空格隔开。所以上面这段代码还可以写为:
- 条件嵌套
if命令的参数组成一条子命令,若该子命令的退出码为0(表示真),则执行then后面的子命令;若退出码非0(表示假),则执行elif、else或者fi后面的子命令。if后面的子命令通常是测试命令,但也可以是其他命令。
这也说明,if的子命令除了 [ 和test命令,还可以放其他命令,只要该命令的退出码为0、1来表示执行结果。
Shell脚本中没有{ }括号,所以用fi表示if语句块的结束。
- 空代码块
如果在代码块中,出现了空语句情况,什么都不写,Shell会直接报错。
:是一个特殊的命令,称为空命令,该命令不做任何事,但是退出码永远为真。所以,我们就可以用 : 来解决上面的问题。
当然,也可以用true / false命令替代 : ,这样就不会报错了。
- &&和 ||
此外,Shell还提供了&&和||语法。
&&相当于“if...then...”。
|| 相当于“if not...then...”。
&&和||用于连接两个命令,而-a和-o仅用于在测试表达式中连接两个测试条件。
Shell这里的{ }中包含的语句会在当前Shell进程中进行执行;而( )中包含的语句会创建新的Shell进程执行。
- case/esac
case命令可类比于C语言的switch/case语句,esac表示case语句块的结束。C语言中的case只能匹配整型或字符型常量表达式,而Shell脚本中的case可以匹配字符串和Wildcard,每个匹配分支可以有若干条命令,末尾必须以 ;; 结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到esac之后,不需要像C语言一样用break跳出。
还有一种情况,如果当有start或者-s选项时,输出“start...”这种逻辑时,就用该采取下面的这种写法:
我们还可以举一个支持通配符的例子: