Unix Shell 和Solaris Shell 介绍(三)
作者:路遥
E-mail:luyaochrist@163.com
适用:初级中级读者
关于Shell编程的文章,我这是第三篇了。我继续给大家以简洁的方式介绍Shell编程。本篇的重点是分支结构和流程控制。
使用分支指令可以基于所给条件的成功与否来执行相应的任务。if命令是最简单的判定方式。if/else命令是一种二路判定结构,if/elif/else命令提供了多路判定结构。
一 If命令
条件的最简单形式就是if命令。在Korn Shell中,跟在if后面的语句是一条或一组命令,if行最后一个命令的退出状态用于决定是否要继续执行then语句后面的命令。如果if行最后一个命令的退出状态为0,则then后面的命令被执行,fi使得then后面的命令停止执行。如果退出状态非0,说明命令失败,则then后面的语句被忽略并且控制会直接转到fi语句之后。条件命令可以嵌套,每一个if必须有一个相应的fi,fi和最近的if配对。
举例说明:
if ypmatch $name passwd > /dev/null 2>&1
then
echo found $name!
fi
ypmatch 是一个NIS命令,用来搜索命令的参数name,该参数位于服务器上的NIS passwd数据库中。标准输出和标准错误输出被重定向到位容器/dev/null。
在这里说明一下什么是NIS,它网络信息服务。使用NIS的好处包括:文件的集中式管理,随网络递增更好的文件缩放式管理,一个NIS域包括一个NIS服务器主机,0个或多个服务器分机,一个或多个客户端。
如果ypmatch命令退出状态为0,程序转到then语句并执行命令直到到达fi。fi标志着then语句后面的命令结束。
二. if/else命令
该命令将允许一个二路分支处理。如果if后面的命令失败,则else后的命令被执行。
if ypmatch $name passwd > /dev/null 2>&1
then
echo found $name!
else
print "can't find $name"
exit 1
fi
上面这个例子,如果ypmatch命令在passwd数据库中没有找到$name,则执行else语句后面的命令。
三.if/elif/else
该命令允许多路分支处理。如果if后的命令失败,则测试elif后的命令;如果elif后的命令成功,则执行与它对应的then后的命令。如果elif后的命令也失败,测试下一个elif后的命令。如果没有命令成功,则执行else后的命令。else块为默认部分。
(脚本)
#!/bin/ksh
#Scriptname:tellage
read age? "How old are you?"
if((age<0||age>130)
then
print "welcome to our planet"
exit 1
fi
if((age>=0&&age<12))
then
print "A child !"
elif ((age>12&&age<20))
then
print "Rebel!"
elif((age>=20&&age<30))
then
print "very good"
elif((age>=30&&age<40))
then
print "old……"
else
print"Sorry"
fi
(输出)
$./tellage.sh
How old are you?200
Welcome to our planet
$./tellage.sh
How old are you?13
Rebel!
$./tellage.sh
How old are you?55
Sorry
其实这些demo都很好理解。最后一个demo先请求用户输入,输入值赋给变量age。else 结构是默认部分。如果上述语句都为假,那么就执行else后面的命令。fi终止最外层的if语句。
除此之外,还有exit命令:用于终止程序并返回命令行,我们可以在有些条件不为真时,使脚本退出。exit命令的参数是一个整数,0~255,当程序退出时,退出值保存在shell的$?。
还有一个常见的case命令:也是一个多路分支命令,可用来代替if/elif.
下面给出case命令的格式:
case variable in
value1)
command(s);;
value2)
command(s);;
*)
command(s);;
esac
当某一值匹配case变量时,跟在改值后面的命令会被执行,直到达到双分号位置。如果case变量找不到匹配,程序执行*)之后,直到达到双分号或者esac。
到这里位置,这次的内容就算结束了。本篇内容相对于一些有多年程序设计经验人来讲,偏简单了点。但是,主要是想给大家一个完整的概念和对Shell一个宏观认识。
下一次可能会将Shell编程里的循环讲解一下,请大家拭目以待。
谢谢大家!
发表于 CQU [Solaris Demo] ( 六月 25, 2008 04:43 上午 ) Permalink | 评论[0]
