当前位置: 首页 > news >正文

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

相关文章:

  • 嵌入式系统的开发流程
  • 【AI论文】用于评估条件图像生成的统一代理框架
  • Spring 单元测试核心注解全解:@InjectMocks、@MockBean、@Mock、@Autowired 的区别与实战
  • 关于字节跳动旗下的豆包(DouBao)软件的详解、核心功能以及与同类产品的对比分析
  • 【C/C++】深入理解整型截断与提升:原理、应用与区别
  • 【Linux网络】Socket 编程TCP
  • 第十六届蓝桥杯大赛软件赛省赛 Python 大学 B 组 满分题解
  • echo命令,tail命令,反引号,重定向符
  • PythonFlask打造高效流式接口的实战
  • SPI接口DAC设备驱动与应用程序开发
  • 面试求助:在性能测试中发现CPU占用过高应该如何进行分析?
  • 科普:如何通过ROC曲线,确定二分类的“理论阈值”
  • Golang|锁相关
  • Python——Matplotlib库的练习
  • HarmonyOS:使用Refresh组件实现页面下拉刷新上拉加载更多
  • 【蓝桥云课】男女搭配 python
  • c语言坦克对战(前言)
  • Rust编程学习(一): 变量与数据类型
  • 51单片机波特率与溢出率的关系
  • FinanceRAG获奖方案解读:ACM-ICAIF ’24的FinanceRAG挑战赛
  • 超新星|18岁冲击中超金靴,王钰栋的未来无限可能
  • 寒武纪陈天石:公司的产品力获得了行业客户广泛认可,市场有望迎来新增量需求
  • 退休10年后,70岁成都高新区管委会原巡视员王晋成被查
  • 白玉兰奖征片综述丨综艺市场破局焕新,多元赛道重塑价值坐标
  • 国家统计局今年将在全国开展两次人口固定样本跟访调查
  • 中美经贸高层会谈在日内瓦结束,中国代表团将举行发布会