首页 > 系统相关 >Shell编程之循环语句

Shell编程之循环语句

时间:2024-06-18 21:27:47浏览次数:13  
标签:语句 bin Shell 编程 echo 循环 root bash

Shell编程之循环语句


在Shell编程中,循环语句是一个非常重要的组成部分,它允许我们重复执行某段代码,直到满足某个条件为止。下面,我将向大家介绍Shell中的几种常见的循环语句:for循环、while循环和until循环。

一、for 循环语句

for 语句的结构

  • 读取不同的变量值,用来逐个执行同一个命令序列
  • for循环通常用于遍历列表(如数组或字符串列表)中的元素
for 变量名 in 取值列表
do
    命令序列
done
  • for 语句的执行流程:
  • 首先将列表中的第一个取值赋给变量,并执行 do…done 循环体中的命令序列;
  • 然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列……
  • 依此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环
    在这里插入图片描述

for 语句应用示例

根据姓名列表批量添加用户和删除

# 用做测试的列表文件chenye
[root@localhost ~]# vi users.txt
chenye
dengchao 
zhangjie
# 批量添加用户的脚本
[root@localhost ~]# vi uaddfor.sh
#!/bin/bash

ULIST=$(cat /root/users.txt) 
for UNAME in $ULIST
do
    useradd $UNAME
    echo "123456" | passwd --stdin $UNAME &>/dev/null 
done
[root@localhost ~]# . uaddfor.sh    //测试并确认执行结果
[root@localhost ~]# tail -3 /etc/passwd
chenye:x:1005:1005::/home/chenye:/bin/bash 
dengchao:x:1006:1006::/home/dengchao:/bin/bash 
zhangjie:x:1007:1007::/home/zhangjie:/bin/bash

# 批量删除用户的脚本
[root@localhost ~]# vi udelfor.sh
#!/bin/bash
ULIST=$(cat /root/users.txt) 
for UNAME in $ULIST
do
    userdel -r $UNAME &>/dev/null 
done
# 测试并确认执行结果
[root@localhost ~]# . udelfor.sh
[root@localhost ~]# id chenye
id: chenye: no such user        # 提示无此用户

根据 IP 地址列表检查主机状态

[root@localhost ~]# vi ipadds.txt    //用做测试的列表文件
172.16.16.1
172.16.16.22
172.16.16.220
[root@localhost ~]# vi chkhosts.sh    //循环检查各主机的脚本
#!/bin/bash
HLIST=$(cat /root/ipadds.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

二、while循环语句

while语句的结构

  • 重复测试某个条件,只要条件成立则反复执行
  • while循环会一直执行循环体内的命令,直到指定的条件不再满足为止
while 条件测试操作
do
    命令序列
done

在这里插入图片描述

while 语句应用示例

批量添加规律编号的用户和删除

[root@bogon ~]# cat uaddwhile.sh
#!/bin/bash

PREFIX="stu"
i=1
while [ $i -le 20 ]     
do
    useradd ${PREFIX}$i
    echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null 
    let i++
done

[root@bogon ~]# . uaddwhile.sh 
[root@bogon ~]# grep "stu" /etc/passwd | tail -3
stu18:x:1067:1067::/home/stu18:/bin/bash
stu19:x:1068:1068::/home/stu19:/bin/bash
stu20:x:1069:1069::/home/stu20:/bin/bash

[root@bogon ~]# cat udelwhile.sh 
#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ] 
do
    userdel -r ${PREFIX}$i
    let i++
done
[root@bogon ~]# . udelwhile.sh
[root@bogon ~]# id stu20
id: stu20: no such user

猜价格游戏

[root@bogon ~]# cat pricegame.sh 
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格范围为 0-999,猜猜看是多少?" 
while true
do
    read -p "请输入你猜测的价格数目:" INT 
    let TIMES++
    if [ $INT -eq $PRICE ] ; then
        echo "恭喜你答对了,实际价格是 $PRICE" echo "你总共猜测了 $TIMES 次"
        exit 0
    elif [ $INT -gt $PRICE ] ; then 
        echo "太高了!"
    else
        echo "太低了!"
    fi
done

三、until循环语句

until语句结构

  • 重复测试某个条件,只要条件不成立则反复执行
  • until循环与while循环相反,它会一直执行循环体内的命令,直到指定的条件满足为止
until 条件测试操作
do
    命令序列
done

在这里插入图片描述

until 语句应用示例

计算 1~50 的和

[root@localhost ~]# cat sum1to50_until_v1.sh 
#!/bin/bash 
i=0;s=0
until [ $i -eq 50 ] 
do
    let "i=$i+1";
    let "s=$s+$i" 
done
    echo 'sum(1..50)='$s
# 在 i 的值小于 50 之前,每次循环 i 的值加 1,并且求出 s 的值
[root@localhost ~]# . sum1to50_until_v1.sh 
sum(1..50)=1275

为指定用户发送在线消息

[root@localhost ~]# cat until-user_online_to_write.sh 
#!/bin/bash 
username=$1
if [ $# -lt 1 ]; then        # 对脚本参数个数不满足条件的进行处理
    echo "Usage:`basename $0` <username> [<message>]"
    exit 1
fi
if grep "^$username:" /etc/passwd > /dev/null;then :        # 判断第一个参数是否为系统用户
else
    echo "$username is not a user on this system." 
    exit 2
fi
until who|grep "$username" > /dev/null;do        # 接收信息的用户必须为登录在线用户
    echo "$username is not logged on."
    sleep 600
done
shift;msg=$*        # shift 去除第一个参数;$*为所有参数的值
[[ "X"$msg == "X" ]] && msg="Are you ready ? $username"        # 判断$msg 是否为空,为空则赋值
echo "$msg" | write $username        # 通过 write 命令给用户发送消息

注意:

  • 在条件判断中,[ ]是测试命令的语法,用于比较整数或检查字符串。注意[ ]之间要有空格。
  • $(( ))是算术扩展的语法,用于进行整数计算。
  • 你可以使用break命令来提前退出循环,或者使用continue命令来跳过当前循环的剩余部分,直接进入下一次循环。

循环语句在Shell编程中非常有用,特别是当你需要重复执行某个任务时。通过合理地使用循环语句,你可以写出更加高效、简洁的Shell脚本。

标签:语句,bin,Shell,编程,echo,循环,root,bash
From: https://blog.csdn.net/m0_74860678/article/details/139783697

相关文章

  • C#图形图像编程
    一.实验目标和实验内容:掌握C#图形绘制基本概念;掌握C#字体处理;能进行C#图形图像综合设计。运行效果如下所示:二.准备(1)创建一个新项目:(2)在工具箱中拖出四个控件,button1,button2,panel,textbox(可单击控件在右下角修改名字)三.代码实现(1)button1privatevoidbutton1_Click(ob......
  • 在现代编程环境中,Perl 如何与其他流行语言(如 Python、Java 等)进行集成和协作?
    在现代编程环境中,Perl可以与其他流行语言(如Python、Java等)进行集成和协作。以下是一些常见的方法:调用外部程序:Perl可以使用系统调用来执行其他语言编写的可执行文件。这意味着可以从Perl中调用Python、Java等程序,并将它们的输出捕获到Perl程序中进行处理。使......
  • shell函数
    shell函数函数定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式函数作用:方便重复使用。函数库,集中在一起,随时可以传参调用。大的工程分割成若干个小的功能模块,提高代码的可读性。函数的格式格式1functionshoping{​     命令序列......
  • 程序分享--常见算法/编程面试题:判断子序列
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • Python编程基础:f-字符串格式
    本文探讨使用Pythonf-字符串格式,也称为“格式化字符串文字”。f-string是格式化字符串的一种很好且简单的方法,适用于Pythonv3.6+。如果你仍然使用.format()方法,必须了解f-字符串。使用字符串格式的优势之一是能够“插入”并格式化字符串数据中的变量。Python字符串format()方......
  • shell函数
    shell函数定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。作用:方便重复使用,可以生成函数库,集中在一起随时可以传参调用。      大的工程分割成若干个小的功能模块,提高代码的可读性。函数的格式:1.function shoping{    命令序列}2. ......
  • shell --- sed 命令
    sed命令经常用于替换字符串,格式为"sed-i's/旧字符串/新字符串/g'文件名",注意有单引号,下同。其中的-i表示实质改变文件内容,如果缺少则不会改变文件;g表示全局替换,如果缺少则只会替换每一行第一次出现的字符串,如下面所示:#将test.txt中所有的a替换为Ased-i's/a/A/g'test.tx......
  • 《C++ Primer》导学系列:第 5 章 - 语句
    5.1简单语句5.1.1基本概念在C++中,简单语句是构成程序的基本单元。每个简单语句以分号(;)结束,可以是表达式、声明或空语句。5.1.2表达式语句表达式语句是由表达式构成的语句,通常用于计算、赋值和函数调用。示例代码#include<iostream>intmain(){inta=10;......
  • 实验7 文件应用编程
    //task4.c#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){ inti,n=0; FILE*fp; fp=fopen("data4.txt","r"); if(fp==NULL){ printf("failtoopenthefile"); return1; } while((i=fgetc(......
  • JavaScript ES6 新特性探索:Proxy 解锁编程新境界
    个人主页:学习前端的小z个人专栏:JavaScript精粹本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论!ES5、ES6介绍文章目录......