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

Shell编程之循环语句

文章目录

  • 引言
  • 1.echo命令参数
  • 2.for循环语句
    • 2.1 for语句的结构
    • 2.2 for语句的执行流程
    • 2.3 for语句应用示例
  • 3. while循环语句
    • 3.1 while 语句的结构
    • 3.2 while 语句的执行流程
    • 3.3 while语句应用示例

引言

在实际工作中,经常会遇到某项目需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,命令都是相同的。当面对各种列表重复执行任务时,使用简单的if语句很难满足要求,并且顺序编写全部代码更是显得异常繁琐,这时候就可以使用for循环语句,可以很好的解决这样的问题

1.echo命令参数

echo [参数] [字符串]

在这里插入图片描述

2.for循环语句

2.1 for语句的结构

  • 使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环

  • for 循环语句的语法结构如下

for 变量名 in 取值列表
do
	命令序列
done
  • 上述语句结构中,操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于 do 和done之间的命令序列称为“循环体”,其中的执行语句需要引用变量以完成相应的任务

2.2 for语句的执行流程

  • 首先将列表中的第1个取值赋给变量,并执行 do···done循环体中的命令序列

  • 然后将列表中的第2个取值赋给变量,并执行循环体中的命令序列……

  • 以此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环

2.3 for语句应用示例

  • 根据姓名列表批量添加用户,操作如下

在这里插入图片描述

[root@clr /opt/mywork]# cat user.txt
gaozhenyang
ergouzi
wolong
fengchu
[root@clr /opt/mywork]# cat add.sh

#!/bin/bash
ud=$(cat /opt/mywork/user.txt)
for uname in $ud
do
        useradd $uname                                       
        echo "123456" |passwd --stdin $uname &>/dev/null
        echo "$uname用户创建成功"
done
[root@clr /opt/mywork]# bash add.sh
gaozhenyang用户创建成功
ergouzi用户创建成功
wolong用户创建成功
fengchu用户创建成功
[root@clr /opt/mywork]# tail -5 /etc/passwd
cd:x:1016:1016::/home/cd:/bin/bash
gaozhenyang:x:1017:1017::/home/gaozhenyang:/bin/bash
ergouzi:x:1018:1018::/home/ergouzi:/bin/bash
wolong:x:1019:1019::/home/wolong:/bin/bash
fengchu:x:1020:1020::/home/fengchu:/bin/bash
  • 根据 IP 地址列表检查主机状态

在这里插入图片描述

[root@clr /opt/mywork]# cat ipadd
192.168.80.1
192.168.80.2
192.168.80.3
192.168.80.20
[root@clr /opt/mywork]# cat ip.sh
#!/bin/bash
host=$(cat /opt/mywork/ipadd)
for IP in $host
do
ping -c 3 -i 0.2 -W 3 $IP &>/dev/null                 #-c是发送ping包的数量为3
        if [ $? -eq 0 ]                               #-i是收发信息的间隔时间为0.2s
then                                                  #-W是超时时间为3s
        echo "HOST $IP is up"
else
        echo "HOST $IP is down"
fi
done
[root@clr /opt/mywork]# bash ip.sh
HOST 192.168.80.1 is up
HOST 192.168.80.2 is up
HOST 192.168.80.3 is down
HOST 192.168.80.20 is up
  • 密码输入正确和错误提示

在这里插入图片描述

[root@clr /opt/mywork]# cat mima.sh
#!/bin/bash
init=123456
for i in {1..3}
do
        read -p "请输入用户密码:" passwd
        if [ $passwd == $init ]
then
        echo "密码正确"
        exit
fi
done
         echo "密码错误"
[root@clr /opt/mywork]# bash mima.sh
请输入用户密码:456123
请输入用户密码:4561596
请输入用户密码:469893
密码错误                     #密码输入错误三次直接退出交互界面
[root@clr /opt/mywork]# bash mima.sh
请输入用户密码:66451
请输入用户密码:123456
密码正确                     #密码输入成功提示密码输入正确

3. while循环语句

for循环语句非常适合于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用while语句

3.1 while 语句的结构

使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。但是在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行

循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环

while循环语句的语法结构如下所示:

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

3.2 while 语句的执行流程

首先判断 while 后的条件测试操作结果,如果条件成立,则执行 do···done 循环体中的命令序列
返回 while 后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体

再次返回到 while 后,判断条件测试结果…如此循环

直到 while 后的条件测试结果不再成立为止,最后跳转到 done 语句,表示结束循环

在这里插入图片描述

3.3 while语句应用示例

  • 批量添加规律编号的用户
    在这里插入图片描述
[root@clr /opt/mywork]# cat useradd.sh
#!/bin/bash
add="clr"
i=1
while [ $i -le 10 ]
do
  useradd ${add}$i
  echo "123456"|passwd --stdin ${clr}$i &>/dev/null
  let i++
done
[root@clr /opt/mywork]# bash useradd.sh
[root@clr /opt/mywork]# grep "clr" /etc/passwd | tail -10
clr1:x:1031:1031::/home/clr1:/bin/bash
clr2:x:1032:1032::/home/clr2:/bin/bash
clr3:x:1033:1033::/home/clr3:/bin/bash
clr4:x:1034:1034::/home/clr4:/bin/bash
clr5:x:1035:1035::/home/clr5:/bin/bash
clr6:x:1036:1036::/home/clr6:/bin/bash
clr7:x:1037:1037::/home/clr7:/bin/bash
clr8:x:1038:1038::/home/clr8:/bin/bash
clr9:x:1039:1039::/home/clr9:/bin/bash
clr10:x:1040:1040::/home/clr10:/bin/bash

上述脚本代码中,使用变量 i 来控制用户名称的编号,初始赋值为1,并且当取值大于10时终止循环。在循环中,通过语句 “let i++”(等同于i=‘expr $i+1’)来使变量i的值增加1,因此当执行第一次循环后i的值将变成2,执行第2次循环后i的值将变成3…以此类推。

  • 猜数字大小
    在这里插入图片描述
[root@clr /opt/mywork]# cat cai.sh
#!/bin/bash
NUM=8
while true 
do
read -p "请输入数字:" sz
        if [ $sz -eq $NUM ];then
                echo "你猜对了!"
                break
elif [ $sz -gt $NUM ];then
                echo "你猜大了"
elif [ $sz -lt $NUM ];then
                echo "你猜小了"
        fi
done
[root@clr /opt/mywork]# bash cai.sh
请输入数字:4
你猜小了
请输入数字:6
你猜小了
请输入数字:7
你猜小了
请输入数字:8
你猜对了!
[root@clr /opt/mywork]# bash cai.sh
请输入数字:20
你猜大了
请输入数字:45
你猜大了
请输入数字:12
你猜大了
请输入数字:9
你猜大了
请输入数字:8
你猜对了!

http://www.kler.cn/a/16572.html

相关文章:

  • 浅谈C#之内存管理
  • 一文详解java的数据类型
  • kafka消费数据太慢了,给优化下
  • AI绘画经验(stable-diffusion)
  • 深入理解 Vue v-model 原理与应用
  • 哪款开放式耳机好用?5款实力出众的开放式耳机按头安利!
  • osg操控器之动画路径操控器osgGA::AnimationPathManipulator分析
  • 代码随想录算法训练营第四十五天|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数
  • MySQL基本操作
  • CAN总线(HALL库使用)
  • vue3通过ref拿element弹框中的组件问题
  • java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
  • virtio-net收包流程
  • 操作系统入门——知识合集[长期更新......]
  • Python调用二分法和牛顿法求方程的根
  • 密码学作业——置换密码部分
  • 真北游记 | 潮汕行的似水流年
  • 拷贝构造函数和赋值重载函数详解
  • 辅助驾驶功能开发-功能对标篇(16)-NOA 城市辅助系统-毫末智行
  • C++标准库 --- 动态内存 (Primer C++ 第五版 · 阅读笔记)
  • 解密.[support2022@cock.li].faust后缀勒索病毒加密的文件:拯救您的企业数据的完整指南!
  • 100+Python挑战性编程练习系列 -- day 2
  • python基于轻量级YOLOv5的生猪检测+状态识别分析系统
  • 读研读博不emo
  • 数字化医院PACS影像系统 三维影像后处理技术应用
  • 100篇帮小白入门——什么是嵌入式系统?