shell程序设计(三)条件测试和控制结构

Bash ginotang 756℃ 0评论

条件测试

shell终端中的条件测试一般包括文件类型检测和值对比,条件测试通过test命令进行。

例如:检测文件夹或者文件是否存在,字符串是否相等,或者字符串是否为空等等。

文件检测

通过-f(file)参数检测一般文件

文件是否可写

文件是否可执行

目录检测

目录的检测使用-d(directory)参数

字符串比较

整数比较

除了相等性比较外,整数还可以进行>(-gt),<(-lt),>=(-ge),<=(-le)比较。

上面的例子列举的是比较常用的操作,更多操作可参看test的manpage。

控制结构

shell的控制结构包括:if、when、while、until、case等。

分支:if

if用于根据特定条件执行不同的操作。它的语法如下:

condition后面的分号“;”可以没有,这样then就要写到下一行。

if 控制结构往往都是和前面的条件测试一起使用,例如:

下面是另一种更常见的写法:

使用“[ -f test.c ]”代替 test -f test.c,不过需要注意的是,[]里面的命令两边都要至少留一个空格,否则命令会出错。

一个简单的例子

文件查找,调用系统的find命令:

另外,当使用test进行字符串比较(小于/大于)的时候,会出现意想不到的问题:

当运行脚本,会输出baseball is greater than hockey。实际上这是错误的结果,原因在于,在比较字符串的时候,>符号被shell当作输出重定向符号处理,但却没有给出任何提示。正确的做法是使用\符号把大于符号或者小于符号转义:

逻辑与(&&)和逻辑或(||)

通常在使用if的时候,需要判断多个条件或者某个条件是否成立的情况,这个时候就需要使用逻辑与和逻辑或

这两个操作符的使用也是非常简单的,和其他语言上的操作符基本一致

语法:

使用语句块

如果你希望在某些只能使用单个语句的地方使用多条语句,就可以把多条语句使用{}括起来,这样shell会把括号中的多条语句当做一个整体处理。例如:

使用双引号防止用户的错误输入

我们永远不要相信用户的输入,也就是说,用户输入的数据并不一定是我们期待的数据,例如:用户直接按回车,什么也不输入。

很明显,我们期待用户输入有价值的数据,但是如果用户直接按下回车,timeofday变量就是一个空的数据,这样,shell就会执行错误,即语句变成:

为了防止这样的错误数据,只需要使用双引号把变量括起来:

在if语句中使用双圆括号(( ))和双方括号[[ ]]

通过使用双圆括号和双方括号,可以在if语句中使用增强的算数运算和字符串比较。

双圆括号支持的算术运算符:

val++、val–、++val、–val、!(取反)、~(位取反)、**(求幂)、<<(左移)、>>(右移)、&(按位与)、|(按位或)、&&(逻辑与)、||(逻辑或)。

简单的例子:

而双方括号主要增强的是字符串的正则表达式支持,例如:

for循环:

for循环语法:

一个简单例子, 列出当前目录的所有内容:

另一个例子:

在循环中结合bash命令使用

除了可以使用上面的方式执行外部命令外,还可以使用$(), 他们的效果是一样的

c-style for循环

新版本的shell支持类c的for循环,类c的for循环需要配合双圆括号使用,如下:

和c语言的for循环一样,它可以同时使用多个变量:

while循环

语法:

一般在不知道需要循环执行多少次的时候,使用while循环。

除了while循环外,还有do…while循环,do…while循环中至少执行一次循环体。

while允许用户设立多个条件测试,例如:

until循环

until循环和while循环差不多,和while循环不同的是,until反复执行直到条件为真,而while循环则条件为真时一直循环,until类似于其他语言的do…while循环。

语法:

处理循环结构中的数据输出

我们可以把循环体中的输出重定向到其他位置,例如文件中。只需要在done关键字后面添加重定向操作符即可。

其他的循环的重定向例如while,until的使用方法一样。

其实除了重定向,还可以使用管道处理循环中的输出,使用方法和重定向类似。

跳出循环

和其他语言一样,shell也可以根据条件跳出循环,使用break和continue命令即可。

break用于跳出循环,不再执行循环中的代码,而continue则用于跳出当前循环,继续执行下一次循环。

case分支

case分支类似于其他语言的switch结构,但shell中只有case没有switch。

语法:

需要注意:每一个模式行都是使用双分号结尾“;;”

一个简单的例子:

使用正则匹配

除了管道符号外,case模式还可以使用正则匹配

 

转载请注明:Pure nonsense » shell程序设计(三)条件测试和控制结构

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x