1、shell 编程 shell 编程分支语句(2)shell 编程分支语句(2)8.if 语句语法:(用于单向判断分支)iflist Athenlist Bfi例子:if test -s funfilethenecho funfile existsfiecho helloif 结构是一种基于命令返回值的的流程控制方式。如果测试命令的返回值为 0,一个指定的命令列表就会被执行,如果用于判断的命令返回值为非 0,指定命令列表会被忽略而不被执行。上例中表明了 if 结构的一个通用的格式:每一个命令列表由一个或者多个 UNIX 系统的 shell 命令组成,每个命令之间用回车符或者分号分隔,list A
2、 中最后被执行的命令决定 if 语句的结果。if 结构执行的过程如下所示:1.list A 命令被执行。2.如果 list A 中的最后一个命令的返回值为 0(真) ,执行 list B 中的命令,然后继续执行 fi 以后的命令。3.如果 list A 中的最后一个命令的返回值为非 0(假) ,跳到 fi 并且继续执行 fi 以后的命令。test 命令通常被用作流程控制,它可以使用任何的 UNIX 命令,因为所有的 UNIX命令都产生一个返回值,以下的例子可以说明:ifgrep kingkong /etc/passwd /dev/nullthenecho found kingkongfiif
3、结构也能在程序出错的时候提供流程控制。如下例所示:if $# -ne 3 thenecho Incorrect syntaxecho Usage: cmd arg1 arg2 arg3exit 99fi9.if-else 结构语法:(用在多分支选择的情况)iflist Athenlist Belselist Cfi例子:if “$X“ -lt 10 thenecho X is less than 10elseecho X is not less than 10fiif-else 结构让你能够在控制命令的返回值为 0 的情况下执行一系列的命令,或者在控制命令的返回值为非 0 的情况下执行另外一系
4、列的命令。这种情况下 if 结构的执行过程是:1.执行 list A 中的命令。2.如果在 list A 中最后一个命令的返回值是 0(真) ,执行 list B 中的命令,然后继续执行 fi 以后的命令。3.如果 list A 中最后一个命令的返回值为非 0(假) ,执行 list C 中的命令,然后执行fi 以后的命令。注意在 list C 中可以包含任何的 UNIX 命令,其中也包括 if。例如:if “$X“ -lt 10 thenecho X is less than 10elseif “$X“ -gt 10 thenecho X is greater than 10elseecho
5、 X is equal to 10fifi注意:每一个 if 必须要有一个 fi 来结束。10.case 结构语法:(多路分支)case word inpatterm1) list A;pattern2)list B;patternN) list N ;esac例子:case $ANS inyes) echo O.K; no) echo no go;esacif-else 结构也能支持多路的分支,但是当有两个或者三个分支的之后,程序会变得十分难以阅读。case 结构提供了实现多路分支的一种更方便的方法。分支选择是顺序地对一个 word 与提供的参数之间的比较结果。这些比较是是严格的基于字符串的
6、对比。当一个匹配成功的时候,对应的命令就会被执行。每个命令的列表都以两个分号结束。在完成了相关的比较之后,程序会在 esac 之后继续执行下去。word 典型的情况下是指向一个 shell 变量。pattern 的组成格式和文件名的生成原则是一致的。以下是一些 pattern 允许的特殊的字符:* 匹配任何字符串和字符包括空字符? 匹配任何单个的字符。. 匹配任何一个括号出现中的字符另外|字符的意义是 OR。注意:在这个结构中的右括号和分号是必须的。case 结构通常被用于菜单选择或者是需要对几个用户输入选项作出选择的时候。12.shell 编程 分支:总结返回值 每一个程序的返回值 echo $?数字 test “$num1“ -lt “$num2“ 字符串 test $string1 = $string2 文件 test test -f filenameexit n 终止程序的允许并且设置返回值if case word incommand listApattern1) command listthen ;command listBpattern2) command listelse ;command listC*) command listfi ; esac执行那个语句基于 listA 中最后一条 字符串 word 会与每一个 pattern 比较命令的返回值