阅读(662) (0)

4.3.2 for条件循环语句

2019-04-11 15:05:42 更新

for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用for循环语句再适合不过了。for循环语句的语法格式如图4-20所示。

图4-20 for循环语句的语法格式

下面使用for循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码。首先创建用户名称的列表文件users.txt,每个用户名称单独一行。读者可以自行决定具体的用户名称和个数:

    [root@linuxprobe ~]# vim users.txt
    andy
    barry
    carl
    duke
    eric
    george

接下来编写Shell脚本Example.sh。在脚本中使用read命令读取用户输入的密码值,然后赋值给PASSWD变量,并通过-p参数向用户显示一段提示信息,告诉用户正在输入的内容即将作为账户密码。在执行该脚本后,会自动使用从列表文件users.txt中获取到所有的用户名称,然后逐一使用“id 用户名”命令查看用户的信息,并使用$?判断这条命令是否执行成功,也就是判断该用户是否已经存在。

需要多说一句,/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。

    [root@linuxprobe ~]# vim Example.sh
    #!/bin/bash
    read -p "Enter The Users Password : " PASSWD
    for UNAME in `cat users.txt`
    do
    id $UNAME &> /dev/null
    if [ $? -eq 0 ]
    then
    echo "Already exists"
    else
    useradd $UNAME &> /dev/null
    echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
    if [ $? -eq 0 ]
    then
    echo "$UNAME , Create success"
    else
    echo "$UNAME , Create failure"
    fi
    fi
    done

执行批量创建用户的Shell脚本Example.sh,在输入为账户设定的密码后将由脚本自动检查并创建这些账户。由于已经将多余的信息通过输出重定向符转移到了/dev/null黑洞文件中,因此在正常情况下屏幕窗口除了“用户账户创建成功”(Create success)的提示后不会有其他内容。

在Linux系统中,/etc/passwd是用来保存用户账户信息的文件。如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息。

    [root@linuxprobe ~]# bash Example.sh
    Enter The Users Password : linuxprobe
    andy , Create success
    barry , Create success
    carl , Create success
    duke , Create success
    eric , Create success
    george , Create success
    [root@linuxprobe ~]# tail -6 /etc/passwd
    andy:x:1001:1001::/home/andy:/bin/bash
    barry:x:1002:1002::/home/barry:/bin/bash
    carl:x:1003:1003::/home/carl:/bin/bash
    duke:x:1004:1004::/home/duke:/bin/bash
    eric:x:1005:1005::/home/eric:/bin/bash
    george:x:1006:1006::/home/george:/bin/bash

您还记得在学习双分支if条件语句时,用到的那个测试主机是否在线的脚本么?既然我们现在已经掌握了for循环语句,不妨做些更酷的事情,比如尝试让脚本从文本中自动读取主机列表,然后自动逐个测试这些主机是否在线。

首先创建一个主机列表文件ipadds.txt:

    [root@linuxprobe ~]# vim ipadds.txt
    192.168.10.10
    192.168.10.11
    192.168.10.12

然后前面的双分支if条件语句与for循环语句相结合,让脚本从主机列表文件ipadds.txt中自动读取IP地址(用来表示主机)并将其赋值给HLIST变量,从而通过判断ping命令执行后的返回值来逐个测试主机是否在线。脚本中出现的$(命令)是一种完全类似于第3章的转义字符中反引号命令的Shell操作符,效果同样是执行括号或双引号括起来的字符串中的命令。大家在编写脚本时,多学习几种类似的新方法,可在工作中大显身手:

    [root@linuxprobe ~]# vim CheckHosts.sh
    #!/bin/bash
    HLIST=$(cat ~/ipadds.txt)
    for IP in $HLIST
    do
    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
    if [ $? -eq 0 ] ; then
    echo "Host $IP is On-line."
    else
    echo "Host $IP is Off-line."
    fi
    done
    [root@linuxprobe ~]# ./CheckHosts.sh
    Host 192.168.10.10 is On-line.
    Host 192.168.10.11 is Off-line.
    Host 192.168.10.12 is Off-line.