使用while循环语句时,有两个特殊的条件测试操作,即true(真)和false(假)。使用true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(或通过exit语句退出脚本);反之,若使用false作为条件,则循环体将不会被执行。这两个特殊条件也可以用在if语句的条件测试中。
3、while语句应用示例 1)批量添加规律编号的用户在一些技术培训和学习领域,出于实验或测试的目的,需要批量添加用户账号,这些用户的名称中包含固定的前缀字串,并按照数字顺序依次进行编号,账号的数量往往也是固定的。
[root@centos01 ~]# vim useraddress.sh <!--批量添加用户的脚本--> [#!/bin/bash prefix="user" i=1 while [ $i -le 20 ] do useradd ${prefix}$i echo "pwd@123" | passwd --stdin ${prefix}$i &> /dev/null let i++ done [root@centos01 ~]# chmod +x useraddress.sh <!--脚本添加执行权限--> [root@centos01 ~]# ./useraddress.sh <!--运行脚本--> [root@centos01 ~]# grep "user" /etc/passwd | tail -20 <!--查看执行结果--> user1:x:1002:1002::/home/user1:/bin/bash user2:x:1003:1003::/home/user2:/bin/bash user3:x:1004:1004::/home/user3:/bin/bash user4:x:1005:1005::/home/user4:/bin/bash user5:x:1006:1006::/home/user5:/bin/bash user6:x:1007:1007::/home/user6:/bin/bash user7:x:1008:1008::/home/user7:/bin/bash user8:x:1009:1009::/home/user8:/bin/bash user9:x:1010:1010::/home/user9:/bin/bash user10:x:1011:1011::/home/user10:/bin/bash user11:x:1012:1012::/home/user11:/bin/bash user12:x:1013:1013::/home/user12:/bin/bash user13:x:1014:1014::/home/user13:/bin/bash user14:x:1015:1015::/home/user14:/bin/bash user15:x:1016:1016::/home/user15:/bin/bash user16:x:1017:1017::/home/user16:/bin/bash user17:x:1018:1018::/home/user17:/bin/bash user18:x:1019:1019::/home/user18:/bin/bash user19:x:1020:1020::/home/user19:/bin/bash user20:x:1021:1021::/home/user20:/bin/bash上述脚本代码中,使用变量i来控制用户名称的编号,初始赋值为1,并且当取值大于20时终止循环。在循环体内部,通过语句“let i++”(等同于i= 'expr $i + 1')来使用变量i的值增加1,因此当执行第一次循环后i的值将变为2,执行第二次循环后i的值将变为3,......,依此类推。
若要删除useraddress.sh ji脚本所添加的用户,只需参考上述脚本代码,将while循环体中添加用户的命令序列改为删除用户的操作即可。
[root@centos01 ~]# vim deluseraddress.sh <!--批量删除用户的脚本--> #!/bin/bash prefix="user" i=1 while [ $i -le 20 ] do userdel -r ${prefix}$i let i++ done [root@centos01 ~]# chmod +x deluseraddress.sh <!--脚本添加执行权限--> [root@centos01 ~]# ./deluseraddress.sh <!--运行脚本--> [root@centos01 ~]# id user20 <!--确认执行结果--> id: user20: no such user 三、使用case分支语句 1、case语句的结构case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值。case分支语句的语法结构如下所示:
case 变量值 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; ...... *) 默认命令序列 esac在上述语句结构中,关键字case后面跟的是“变量值”,即“$变量名”,这点需要与for循环语句的结构加以区别。整个分支结构包括在case...esac之间,中间的模式1、模式2、......、对应为变量的不同取值(程序期望的取值),其中作为通配符,可匹配任意值。
2、case语句的执行流程首先使用“变量值”与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号“;;”后跳转至esac,表示结束分支;若与模式1不相匹配,则继续与模式2进行比较,若取值相同则执行模式2后的命令序列,直到遇见双分号“;;”后跳转至esac,表示结束分支......依此类推,若找不到任何匹配的值,则执行默认模式“*)”后的命令序列,直到遇见esac后结束分支。如下图所示:
使用case分支语句时,有几个值得注意的特点如下所述:
case行尾必须为单词“in”,每一模式必须以右括号“)”结束。
双分号“;;”表示命令序列的结束。
模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示或。
最后的“)”表示默认模式,其中的相当于通配符。
3、case语句应用示例 1)检查用户输入的字符类型