linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > SHELL >
栏目导栏
资料搜索
热门文章
·csh shell编程入门
·玩转Linux shell命令提示符
·Bourne Shell及shell编程
·Shell 编程实例集锦
·Linux下的shell编程入门
·Shell编程基础
·linux shell 编程基础
·shell基础十二篇
·Linux的Shell编程
·linux Shell编程入门 实例讲解
·Linux主要shell命令详解
·Linux shell 脚本实例一
·深入浅出Shell编程: Shell 变量
·shell命令(一)
·UNIX/LINUX SHELL 正则表达式语
最新文章
·Linux系统中加入自定义Shell为
·Shell学习:关于替换命令-tr-R
·Linux Shell学习:uniq命令使用
·uClinux操作系统下的shell功能
·Shell编程基础:单引号和双引号
·Linux操作系统下Shell语句元字
·Linux系统环境程序设计之路
·Linux Shell中PS命令中的%CPU的
·Linux Shell元字符知识笔记
·压缩命令-vi-认识SHELL-正规表
·Linux系统下Shell命令行快捷键
·谈Linux Shell下的输出重定向
·在Shell中执行vi/cp/mv时自动备
·shell数组介绍
·开启和关闭Shell特性的小技巧
Google
 
shell编程-shell编程-分支语句
[ 作者:  加入时间:2006-07-16 21:07:03  来自: ]
目标:vFwLinux联盟
完成这一章,你将能够作以下事情:vFwLinux联盟
描述条件分支语句中返回值的作用。 vFwLinux联盟
使用test命令来分析一个命令的返回值。 vFwLinux联盟
在shell程序中使用if和case结构。 vFwLinux联盟
 1.返回值vFwLinux联盟
 shell变量“?”中保存上一个被执行命令的返回值:vFwLinux联盟
 0: 命令成功地执行(真)vFwLinux联盟
非零:命令由于出现错误而被终止(假)vFwLinux联盟
 例子:vFwLinux联盟
$ true $ falsevFwLinux联盟
$ echo $?   $ echo $?vFwLinux联盟
0  1vFwLinux联盟
$ ls $ cp vFwLinux联盟
$ echo $?  Usage: cp f1 f2vFwLinux联盟
0 cp [-r] f1 ....fn d1vFwLinux联盟
$ echo $?$echo $?vFwLinux联盟
0 1vFwLinux联盟
  $echo $?vFwLinux联盟
 0vFwLinux联盟
UNIX操作系统的所有命令在结束的时候都会产生一个返回值。这个返回值通常被用来判断命令是正常结束(返回0)还是发生了错误(返回非零值)。通过返回的非零值还可以看出发生的是什么错误。例如,语法错误通常返回1,true命令返回的就是0,而false命令返回的是1。vFwLinux联盟
大多数的shell程序中的判断语句都是通过分析这个返回值来进行流程控制的。shell中定义了一个特殊的变量“?”用来保存上一个命令结束后的返回值。vFwLinux联盟
你可以通过以下方式来观察前一个命令的返回值:vFwLinux联盟
echo $?vFwLinux联盟
当你执行一个条件判断(小于,大于,等于)的时候,返回值会指明这个条件是否为真(返回0)或者为假(返回非零)。vFwLinux联盟
条件判断语句会在下几节中讲述。vFwLinux联盟
 2.test 命令vFwLinux联盟
语法:vFwLinux联盟
test expression 或者 [expression]vFwLinux联盟
test命令对表达式进行测试,并且设置返回值。vFwLinux联盟
 表达式的值 返回值vFwLinux联盟
true0vFwLinux联盟
false 非零(通常为1)vFwLinux联盟
test命令能够测试的对象有:vFwLinux联盟
整数 vFwLinux联盟
字符串 vFwLinux联盟
文件 vFwLinux联盟
test命令被用来评估表达式并且产生返回值。它用参数组成逻辑表达式并且对表达式的返回值进行评估,test命令不会产生标准输出,你必须必须通过返回值来判断test命令的结果,如果表达式为真,返回值会为0,如果表达式为假,返回值为1。vFwLinux联盟
test命令可以被单独使用,然后你能够看到返回值,但它用的最多的还是在if和while结构中用来提供条件流程控制。vFwLinux联盟
test命令的也可以用[expression]来代替。这种方式可以提高可读性,特别是在处理数字或者字符串的时候。vFwLinux联盟
注意:在"["和"]"符号的周围必须要有空格。vFwLinux联盟
 3.test命令之数字testvFwLinux联盟
语法:vFwLinux联盟
[ number relation number ]通过关系运算符来对数字进行比较vFwLinux联盟
关系运算符:vFwLinux联盟
-lt 小于vFwLinux联盟
-le 小于或者等于vFwLinux联盟
-gt 大于vFwLinux联盟
-ge 大于或者等于vFwLinux联盟
-eq 等于vFwLinux联盟
-ne 不等于vFwLinux联盟
例子(假设X=3):vFwLinux联盟
$ [ "$X" -lt 7]$ [ "$X" -gt 7]vFwLinux联盟
$ echo $?  $ echo $?vFwLinux联盟
0  1vFwLinux联盟
test命令能被用于比较两个整数之间的数字关系,通常用[.....]语法来调用。test命令的返回值就能说明这个条件为真还是为假。vFwLinux联盟
当test一个变量的值的时候,你应该防止变量不要为空值,例如:vFwLinux联盟
$ [ $XX -eq 3]vFwLinux联盟
sh: test:argument expectedvFwLinux联盟
如果变量XX在前面没有被赋值,XX的值会是NULL。当shell执行变量替代的时候,shell会试图执行如下语句:vFwLinux联盟
[ -eg 3]vFwLinux联盟
而这个语句不是一个完整的test语句,并且会导致一个语法错误。解决这个问题的一个简单的方法就是在被测试的变量的周围加上引号。vFwLinux联盟
[ "$XX" -eq 3]vFwLinux联盟
当shell执行变量替代的时候,shell会试图执行如下语句:vFwLinux联盟
["" -eq 3]vFwLinux联盟
这会确保至少有一个NULL值作为一个参数提供给这个test命令使用。vFwLinux联盟
注意:作为一个通用的规则,你应该在所有的$变量加上双引号来避免shell发生不正确的变量的替代。vFwLinux联盟
4.test命令-字符串testvFwLinux联盟
语法:vFwLinux联盟
[ string1 = string2] 判断字符串是否相等vFwLinux联盟
[ string1 !=string2] 判断字符串是否不等vFwLinux联盟
例子;vFwLinux联盟
$ X=abc $ X=abcvFwLinux联盟
$ [ "$X" = "abc"] $ ["$X" != "abc"]vFwLinux联盟
$ echo $? $ echo $?vFwLinux联盟
0 1vFwLinux联盟
test命令也能够用来计较两个字符串是否相等。vFwLinux联盟
[...] 语法通常用作字符串的比较。你已经看到在[]周围必须要有空格,同时在操作符周围也必须要有空格存在。vFwLinux联盟
字符串操作包括:vFwLinux联盟
string1 = string2 如果string1等于string2就为真vFwLinux联盟
string1 != string2  如果string1不等于string2就为真vFwLinux联盟
-z string 如果string的长度为0就为真vFwLinux联盟
-n string 如果string的长度为非零就为真vFwLinux联盟
string  如果string的长度为非零就为真vFwLinux联盟
为了防止变量中包含空白字符,这里引号同样也能够保护字符串的test,,例如:vFwLinux联盟
$ X="yes we will"vFwLinux联盟
$ [ $X=yes] 会导致一个语法错误vFwLinux联盟
shell会解释这个语句为[yes we will = yes ]vFwLinux联盟
$ [ "$x" = yes ] 正确的语法vFwLinux联盟
shell会解释这个语句为:[ "yes we will" = yes ]vFwLinux联盟
在执行数字比较的时候,shell会将所有的参数当成是数字,在执行字符串比较的时候,shell会把所有的参数当成是字符串。如下例所示:vFwLinux联盟
$ X=03vFwLinux联盟
$ Y=3vFwLinux联盟
$ [ "$X" -eq "$Y" ] 比较数字03和数字3vFwLinux联盟
$ echo $?vFwLinux联盟
0为真,因为它们是相等的数字vFwLinux联盟
$ [ "$X" = "$Y" ]比较字符串“03”和字符串“3”vFwLinux联盟
$ echo $?vFwLinux联盟
1为假,因为它们是不相同的字符串vFwLinux联盟
 5.test命令- 文件比较vFwLinux联盟
语法:vFwLinux联盟
test -option filename通过选项对文件进行testvFwLinux联盟
例子:vFwLinux联盟
$ test -f funfilevFwLinux联盟
$ echo $?vFwLinux联盟
0vFwLinux联盟
$ test -d funfilevFwLinux联盟
$ echo $?vFwLinux联盟
1vFwLinux联盟
shell提供的一个有用的test特性是可以用它来test文件的特征,例如文件类型和许可权限。例如:vFwLinux联盟
$ test -f filenamevFwLinux联盟
如果文件存在并且是一个普通文件(不是目录或者设备文件),会返回真(0)。vFwLinux联盟
test -s filenamevFwLinux联盟
如果文件存在并且其字节数大于0,会返回真(0)。vFwLinux联盟
其它还有许多有用的文件test方式,比如:vFwLinux联盟
-r file如果文件存在并且是可读的时候为真vFwLinux联盟
-w file  如果文件存在并且是可写的时候为真vFwLinux联盟
-x file  如果文件存在并且是可执行的时候为真vFwLinux联盟
-d directory 目录存在并且是个目录的时候为真vFwLinux联盟
6.test命令-其他操作符vFwLinux联盟
语法:vFwLinux联盟
-o ORvFwLinux联盟
-a ANDvFwLinux联盟
\( \)  GROUPINGvFwLinux联盟
例子:vFwLinux联盟
$ [ "$ANS" = y -o "ANS' = Y ]vFwLinux联盟
$ [ "$NUM -gt 10 -a "$NUM" -lt 20 ]vFwLinux联盟
$ test -s file -a -r filevFwLinux联盟
注意:()前面必须要用斜杠。vFwLinux联盟
使用Boolean操作符可以同时测试多个条件。vFwLinux联盟
例子:vFwLinux联盟
$ [ "$ANS" = y -o "$ANS" = Y ]vFwLinux联盟
$ [ "$NUM" -gt 10 -a "$NUM" -lt 20 ]vFwLinux联盟
$ test -s file -a -r file -a -x filevFwLinux联盟
NOT操作符(!)被用作连接其他的操作符,特别是在文件test的时候用的很普遍。在!操作符和其他的操作符之间必须要有空格,例如:vFwLinux联盟
test ! -d filevFwLinux联盟
能够用来代替vFwLinux联盟
test -f file -o -c file -o -b file ....vFwLinux联盟
括号被用来对操作符进行分组,但是在shell中括号还有一个特殊的意义就是优先运算的意义。因此,括号前面必须使用\符号来忽略其原有含义。vFwLinux联盟
以下的命令验证:有两个命令行参数,并且第一个命令行参数是一个-m ,并且最后一个命令行参数是一个目录或者是一个字节数大于0的文件:vFwLinux联盟
[ \( $# = 2 \) -a \( "$1" = "-m" \) -a \( -d "$2" -o -s "$2" \) ]vFwLinux联盟
7.exit命令vFwLinux联盟
语法:vFwLinux联盟
exit [arg]vFwLinux联盟
例子:vFwLinux联盟
$ cat exit_testvFwLinux联盟
echo exiting program nowvFwLinux联盟
exit 99vFwLinux联盟
$ exit_testvFwLinux联盟
exiting_program nowvFwLinux联盟
$ echo $?vFwLinux联盟
99vFwLinux联盟
exit命令结束当前shell程序的执行并且设置返回值。通常0被用来说明正常结束,而非0值用来说明一个错误的条件。如果没有特别指明返回值,返回值将被设置为exit命令上一个命令的返回值。vFwLinux联盟
8.if语句vFwLinux联盟
语法:(用于单向判断分支)vFwLinux联盟
ifvFwLinux联盟
list AvFwLinux联盟
thenvFwLinux联盟
list BvFwLinux联盟
fivFwLinux联盟
例子:vFwLinux联盟
if vFwLinux联盟
test -s funfilevFwLinux联盟
thenvFwLinux联盟
echo funfile existsvFwLinux联盟
fivFwLinux联盟
echo hellovFwLinux联盟
if 结构是一种基于命令返回值的的流程控制方式。如果测试命令的返回值为0,一个指定的命令列表就会被执行,如果用于判断的命令返回值为非0,指定命令列表会被忽略而不被执行。vFwLinux联盟
上例中表明了if结构的一个通用的格式:每一个命令列表由一个或者多个UNIX系统的shell命令组成,每个命令之间用回车符或者分号分隔,list A中最后被执行的命令决定if语句的结果。vFwLinux联盟
if结构执行的过程如下所示:vFwLinux联盟
1.list A命令被执行。vFwLinux联盟
2.如果list A中的最后一个命令的返回值为0(真),执行list B中的命令,然后继续执行fi以后的命令。vFwLinux联盟
3.如果list A中的最后一个命令的返回值为非0(假),跳到fi并且继续执行fi以后的命令。vFwLinux联盟
test命令通常被用作流程控制,它可以使用任何的UNIX命令,因为所有的UNIX命令都产生一个返回值,以下的例子可以说明:vFwLinux联盟
ifvFwLinux联盟
grep kingkong /etc/passwd > /dev/nullvFwLinux联盟
thenvFwLinux联盟
echo found kingkongvFwLinux联盟
fivFwLinux联盟
if结构也能在程序出错的时候提供流程控制。如下例所示:vFwLinux联盟
if vFwLinux联盟
[ $# -ne 3 ]vFwLinux联盟
thenvFwLinux联盟
echo Incorrect syntaxvFwLinux联盟
echo Usage: cmd arg1 arg2 arg3vFwLinux联盟
exit 99vFwLinux联盟
fivFwLinux联盟
9.if-else 结构vFwLinux联盟
语法:(用在多分支选择的情况)vFwLinux联盟
ifvFwLinux联盟
list AvFwLinux联盟
thenvFwLinux联盟
list BvFwLinux联盟
elsevFwLinux联盟
list CvFwLinux联盟
fivFwLinux联盟
例子:vFwLinux联盟
if [ "$X" -lt 10 ]vFwLinux联盟
thenvFwLinux联盟
echo X is less than 10vFwLinux联盟
elsevFwLinux联盟
echo X is not less than 10vFwLinux联盟
fivFwLinux联盟
if-else结构让你能够在控制命令的返回值为0的情况下执行一系列的命令,或者在控制命令的返回值为非0的情况下执行另外一系列的命令。vFwLinux联盟
这种情况下if结构的执行过程是:vFwLinux联盟
1.执行list A中的命令。vFwLinux联盟
2.如果在list A中最后一个命令的返回值是0(真),执行list B中的命令,然后继续执行fi以后的命令。vFwLinux联盟
3.如果list A中最后一个命令的返回值为非0(假),执行list C中的命令,然后执行fi以后的命令。vFwLinux联盟
注意在list C中可以包含任何的UNIX命令,其中也包括if。例如:vFwLinux联盟
if vFwLinux联盟
[ "$X" -lt 10 ]vFwLinux联盟
thenvFwLinux联盟
echo X is less than 10vFwLinux联盟
elsevFwLinux联盟
ifvFwLinux联盟
[ "$X" -gt 10 ]vFwLinux联盟
thenvFwLinux联盟
echo X is greater than 10vFwLinux联盟
elsevFwLinux联盟
echo X is equal to 10vFwLinux联盟
fivFwLinux联盟
fivFwLinux联盟
注意:每一个if必须要有一个fi来结束。vFwLinux联盟
10.case结构vFwLinux联盟
语法:(多路分支)vFwLinux联盟
case word invFwLinux联盟
patterm1) list AvFwLinux联盟
;;vFwLinux联盟
pattern2)list BvFwLinux联盟
;;vFwLinux联盟
patternN) list NvFwLinux联盟
 ;;vFwLinux联盟
esacvFwLinux联盟
例子:vFwLinux联盟
case $ANS invFwLinux联盟
yes) echo O.KvFwLinux联盟
;;vFwLinux联盟
 no) echo no govFwLinux联盟
;;vFwLinux联盟
esacvFwLinux联盟
if-else结构也能支持多路的分支,但是当有两个或者三个分支的之后,程序会变得十分难以阅读。case结构提供了实现多路分支的一种更方便的方法。分支选择是顺序地对一个word与提供的参数之间的比较结果。这些比较是是严格的基于字符串的对比。当一个匹配成功的时候,对应的命令就会被执行。每个命令的列表都以两个分号结束。在完成了相关的比较之后,程序会在esac之后继续执行下去。vFwLinux联盟
word典型的情况下是指向一个shell变量。vFwLinux联盟
pattern的组成格式和文件名的生成原则是一致的。vFwLinux联盟
以下是一些pattern允许的特殊的字符:vFwLinux联盟
* 匹配任何字符串和字符包括空字符vFwLinux联盟
? 匹配任何单个的字符。vFwLinux联盟
[...] 匹配任何一个括号出现中的字符vFwLinux联盟
另外|字符的意义是OR。vFwLinux联盟
注意:在这个结构中的右括号和分号是必须的。vFwLinux联盟
case结构通常被用于菜单选择或者是需要对几个用户输入选项作出选择的时候。vFwLinux联盟
12.shell编程 -分支:总结vFwLinux联盟
返回值每一个程序的返回值 - echo $?vFwLinux联盟
数字test[ "$num1" -lt "$num2" ]vFwLinux联盟
字符串test[ $string1 = $string2 ]vFwLinux联盟
文件test  test -f filenamevFwLinux联盟
exit n  终止程序的允许并且设置返回值vFwLinux联盟
if case word invFwLinux联盟
command listApattern1) command listvFwLinux联盟
then ;;vFwLinux联盟
command listBpattern2) command listvFwLinux联盟
else ;;vFwLinux联盟
command listC*) command listvFwLinux联盟
fi ;;vFwLinux联盟
 esacvFwLinux联盟
执行那个语句基于listA中最后一条字符串word会与每一个pattern比较vFwLinux联盟
命令的返回值vFwLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息