Linux——Shell编程之循环语句(笔记)

For循环语句

1、for语句的结构与逻辑:

    使用for循环语句时,我们需要指定一个变量以及取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量使用完退出循环。结构如下:

for 变量 in 取值列表
    do
        命令序列
    done

    对于for语句的操作对象——用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。然后位于do...done之间的命令序列称为循环体,其中的执行语句需引用变量以完成相应的任务。逻辑图如下:

 2、应用示例:

(1)根据姓名列表批量添加用户
 [root@localhost ~]#vim /root/users.txt    //用于测试的列表文件
zhangsan
lisi
wangwu
 [root@localhost ~]#vim uadd.sh    //批量添加用户的脚本
#!/bin/bash
ULIST=$(cat /root/users.txt)

for UNAME in $ULIST
do
    useradd $UNAME
    echo    "aptech" | passwd --stdin $UNAME &>/dev/null
done
 [root@localhost ~]#chmod +x uaddfor.sh
 [root@localhost ~]#./uaddfor.sh    //测试并确认执行结果
 [root@localhost ~]#tail -3 /etc/passwd
zhangsan:x:... ...    //省略内容
 [root@localhost ~]#vim udelfor.sh    //测试并确认结果
 [root@localhost ~]#id zhangsan
id: zhangsan: no such user    //无此用户
(2)根据IP地址列表检查主机状态
 [root@localhost ~]#vim /root/ipadds.txt    //测试的列表文件
176.16.16.1
192.168.137.1
192.168.137.254
 [root@localhost ~]#vim chkhosts.sh    //循环检查各主机的脚本
#!/bin/bash
HLIST=$(cat /root/ipadd.txt)
    for IP in $ HLIST
do
    ping -c 3 -i 0.2 -W 3 $IP    &> /dev/null
    //-c 发送包的数量;-i 发送ping包间隔;-W 超时时间
if [ $? -eq 0 ]
then
    echo "Host $IP is up."
else
    echo "Host $IP is down."
fi
done
 [root@localhost ~]#chmod +x chkhosts.sh
 [root@localhost ~]#./chkhost.sh    //测试并确认执行结果
Host 172.16.16.1 is down.
Host 192.168.137.1 is down.
Host 192.168.137.254 is up.

While循环语句

1、while语句的结构与逻辑:

    根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。注意避免出现死循环的情况的情况,否则之后的命令操作将无法进行。结构如下:

while 条件语句操作
do 
    命令序列
done

    使用while循环语句时,有两个特殊的条件测试操作,即true(真)和false(假)。使用true作为条件,条件永远成立,命令序列将无限执行;使用false作为条件,则循环体将不会被执行。这两个特殊条件也可以用在if语句的条件测试中。逻辑图如下:

 2、应用示例:

(1)批量添加规律编号的用户
[root@localhost ~]#vim uadd.sh    //批量添加用户的脚本
#!/bin/bash
PREFIX="lemon"
i=1
while [ $1 -le 20 ]
do
    useradd ${PREFIX}$i
    echo "123456" | passwd --stadin ${PREFIX}$i &> /dev/null
    let i++
done
[root@localhost ~]#chmod +x uadd.sh
[root@localhost ~]#./uadd.sh
[root@localhost ~]#grep "lemon" /etc/passwd | tail -3
lemon11:x:...    ...    //省略部分信息
[root@localhost ~]#vim /udel.sh    //批量删除用户的脚本
#!/bin/bash
PREFIX="lemon"
i=1
while [ $i -le 20 ]
do
    userdel -r ${PREFIX}$i
    let i++
done
[root@localhost ~]#chmod +x udel.sh
[root@localhost ~]#./udel.sh    //测试并确认结果
[root@localhost ~]#id lemon20
id:lemon20:无此用户

Until 循环语句

(1)until语句的结构:

    until与while完全相反,while循环在条件为“真”是继续执行循环,而until则是在条件为假时执行循环。结构如下:

until 条件测试操作
do
    命令序列
done

    until语句首先判断until后的条件测试结果,如果条件不成立,则执行do...done循环体中的命令序列;返回until后再次判断条件测试结果,如果条件仍然不成立,则继续执行循环体;再次返回到until后,判断条件测试结果...直到测试结果成立为止,跳到done语句,表示结束循环。逻辑如下:

(2)应用示例

为指定用户发送在线消息

[root@localhost ~]#vim until-user_online_to_write.sh
#!/bin/bash
#检查参数数量是否足够
if [ $# -lt 2 ];
    then
        echo "Usage: $0 <username1> <username2> ... <message>"
    exit 1
fi

#提取消息,消息为最后一个参数
message="${!#}"

#遍历除最后一个参数外的所有用户名
for username in "${@:1:$#-1}"; do

#检查用户是否为系统内用户
if ! grep -q "^$username:" /etc/passwd; then
    echo "$username is not a valid user on this system."
    continue
fi

#持续检查用户是否登录
while ! who | grep -q "$username"; do
    echo "$username is not logged on. Waiting for the user to log in ..."
    sleep 60
done

#用户已登录,发送消息
    echo "Sending message to $username..."
    write "$username" <<EOF
$message
EOF
    if [ $? -ne 0 ] ; then
        echo "Failed to send message to $username."
    fi
done
[root@localhost ~]#chmod +x until-user_online_to_write.sh
[root@localhost ~]#./until-user_online_to_write.sh root
//发个root自己,消息为空
Message from root@localhost on pts/0 at 16:23 ... Are you ready ? root
EOF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值