(3).使用逻辑运算符,包括!、&&和||。该特性主要是为普通命令而提供,因为测试语句自身就支持逻辑运算。所以,对于测试语句就提供了两种写法,一种是将逻辑运算符作为测试语句的一部分,一种是将逻辑运算符作为if语句的一部分。例如:
if ! id "$name" &>/dev/null;then echo "$name" miss;fi if ! [ 3 -eq 3 ];then echo go;fi if [ ! 3 -eq 3 ];then echo go;fi if [ 3 -eq 3 ] && [ 4 -eq 4 ] ;then echo go;fi if [ 3 -eq 3 -a 4 -eq 4 ];then echo go;fi if [[ 3 -eq 3 && 4 -eq 4 ]];then echo go;fi
注意,在if语句中使用()不能改变优先级,而是让括号内的语句成为命令列表并进入子shell运行。因此,要改变优先级时,需要在测试语句中完成。
1.3 条件结构:case语法结构:
case word in
[ [(] pattern [| pattern]…)
command-list ;;]
…
esac
sysV风格的服务启动脚本是shell脚本中使用case语句最典型案例。例如:
case "$1" in start) start;; stop) stop;; restart) restart;; reload | force-reload) reload;; status) status;; *) echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}" exit 2 esac
从上面的示例中,可以看出一些结论:
(1).case中的每个小分句都以双分号";;"结尾,但最后一个小分句的双分号可以省略。实际上,小分句除了使用";;"结尾,还可以使用";&"和";;&"结尾,只不过意义不同,它们用的不多,不过为了文章完整性,稍后还是给出说明。
(2).每个小分句中的pattern部分都使用括号"()"包围,只不过左括号"("不是必须的。
(3).每个小分句的pattern支持通配符模式匹配(不是正则匹配模式,因此只有3种通配元字符:"*"、"?"和[...]),其中使用"|"分隔多个通配符pattern,表示满足其中一个pattern即可。例如"([yY] | [yY][eE][sS]])"表示即可以输入单个字母的y或Y,还可以输入yes三个字母的任意大小写格式。
set -- y;case "$1" in ([yY]|[yY][eE][sS]) echo right;;(*) echo wrong;;esac
其中"set -- string_list"的作用是将输入的string_list按照IFS分隔后分别赋值给位置变量$1、$2、$3...,因此此处是为$1赋值字符"y"。
(4).最后一个小分句使用的pattern是"*",表示无法匹配前面所有小分句时,将匹配该小分句。一般最后一个小分句都会使用"*"避免case语句无法匹配的情况,在shell脚本中,此小分句一般用于提示用户脚本的使用方法,即给出脚本的Usage。
(5).附加一个结论:如果任何模式都不匹配,该命令的返回状态是零;否则,返回最后一个被执行的命令的返回值。
如果小分句不是使用双分号";;"结尾,而是使用";&"或";;&"结尾,则case语句的行为将改变。
◇ ";;"结尾符号表示小分句执行完成后立即退出case语句。
◇ ";&"表示继续执行下一个小分句中的command部分,而无需进行匹配动作,并由此小分句的结尾符号来决定是否继续操作下一个小分句。
◇ ";;&"表示继续向后(不止是下一个,而是一直向后)匹配小分句,如果匹配成功,则执行对应小分句中的command部分,并由此小分句的结尾符号来决定是否继续向后匹配。
示例如下:
set -- y case "$1" in ([yY]|[yY][eE][sS]) echo yes;& ([nN]|[nN][oO]) echo no;; (*) echo wrong;; esac yes no
在此示例中,$1能匹配第一个小分句,但第一个小分句的结尾符号为";&",所以无需判断地直接执行第二个小分句的"echo no",但第二个小分句的结尾符号为";;",于是直接退出case语句。因此,即使$1无法匹配第二个小分句,case语句的结果中也输出了"yes"和"no"。
set -- y case "$1" in ([yY]|[yY][eE][sS]) echo yes;;& ([nN]|[nN][oO]) echo no;; (*) echo wrong;; esac yes wrong
在此示例中,$1能匹配第一个小分句,但第一个小分句的结尾符号为";;&",所以继续向下匹配,第二个小分句未匹配成功,直到第三个小分句才被匹配上,于是执行第三个小分句中的"echo wrong",但第三个小分句的结尾符号为";;",于是直接退出case语句。所以,结果中输出了"yes"和"wrong"。
1.4 条件结构:selectshell中提供菜单选择的条件判断结构。例如: