前言

上篇文章我们探讨了for循环,如果你还没有开始学习,可以点击链接学习:https://blog.csdn.net/wisdom_futrue/article/details/131402075

今天我们一起来聊聊while循环。

文章目录

    • 前言
  • while循环的介绍
  • while的语法结构
  • 案例实战
    • 1.循环打印企业官网,read指令用于读取行或者读取变量
    • 2. 实现循环打印1至100数字,expr用于运算逻辑
    • 3.While循环求1-100的总和
    • 4. 让用户在10s中内输入ip地址,并判断IP是否符合规范
    • 5. 每10秒钟判断mufengrow是否登录系统
    • 6. 猜数字游戏
    • 7. 问答游戏
  • 拓展 :shell脚本中表示递增有几种写法
  • 总结

while循环的介绍

While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头,done结尾。

while支持条件测试语句
整数比对
字符串比对
正则比对
文件比对

while读入文件的方式比较的特殊
while读入文件按行读取 IFS指定分隔符
for读入文件按空格读取 IFS指定分隔符

举例:

while read  file
doecho $file
done < /etc/passwd

while的语法结构

语法格式一:
while [条件]
do操作
done语法格式二:
while read line
do操作
done  <  file通过read命令每次读取一行文件,文件内容有多少行,while循环多少次

案例实战

1.循环打印企业官网,read指令用于读取行或者读取变量

#!/bin/bash
#2022年12月8日
#auto print company-web
#By author 沐风晓月
while read line
do
echo $line
done < company.txt

其中company.txt内容为:
www.baidu.com
www.taobao.com
www.qq.com

2. 实现循环打印1至100数字,expr用于运算逻辑

#!/bin/bashcounter=1while [ $counter -le 100 ]
doecho $countercounter=`expr $counter + 1`
done

expr 进行递增操作 counter = counter + 1

3.While循环求1-100的总和

#!/bin/bashcounter=1
sum=0while [ $counter -le 100 ]
dosum=$(expr $sum + $counter)counter=$(expr $counter + 1)
doneecho "总和为: $sum"

4. 让用户在10s中内输入ip地址,并判断IP是否符合规范

#!/bin/bash
# 作者:mufenggrowread -p "请输入IP地址:" ip_address# 定义IP地址正则表达式
ip_regex="^([0-9]{1,3}\.){3}[0-9]{1,3}$"# 获取当前时间戳
start_time=$(date +%s)
end_time=$((start_time + 10))while true; do# 判断是否超过10秒current_time=$(date +%s)if ((current_time >= end_time)); thenecho "输入超时!"breakfi# 检查IP地址是否符合规范if [[ $ip_address =~ $ip_regex ]]; thenecho "IP地址符合规范!"breakelseecho "IP地址不符合规范,请重新输入:"read -p "请输入IP地址:" ip_addressfi
done

此脚本中:使用=~运算符将用户输入与正则表达式进行匹配
ip_regex="^([0-9]{1,3}\.){3}[0-9]{1,3}$"是一个用于验证IP地址格式的正则表达式。

让我们逐步解释这个表达式:

  • ^ 表示匹配字符串的开头。
  • ([0-9]{1,3}.){3} 是一个重复的子模式,用于匹配3个类似于"数字数字数字."的组合。其中 [0-9]{1,3} 表示匹配一个或多个长度为 1 到 3 的数字,. 表示匹配正好一个点号。
  • [0-9]{1,3} 表示匹配一个或多个长度为 1 到 3 的数字,这是用于匹配IP地址的最后一组数字。
  • $ 表示匹配字符串的结尾。

综上所述,整个正则表达式可以用于匹配符合标准IPv4地址格式的字符串。该格式要求IP地址由4个数字组成,每个数字的范围是 0 到 255,数字之间由点号分隔。
以下是一些符合IP地址格式的示例:

192.168.0.1
10.0.0.255
172.16.100.50

使用这个正则表达式,可以在Shell脚本中判断用户输入的IP地址是否符合规范。

5. 每10秒钟判断mufengrow是否登录系统

#!/bin/bash
# 作者:mufenggrowwhile true; do# 使用who命令获取当前登录的用户信息logged_in_users=$(who | grep "mufenggrow")# 检查是否有mufenggrow用户登录if [ -n "$logged_in_users" ]; thenecho "mufenggrow用户已登录系统!"elseecho "mufenggrow用户未登录系统。"fi# 等待10秒sleep 10
done

6. 猜数字游戏

#!/bin/bash
# 作者:mufenggrow# 生成一个1到100之间的随机数
secret_number=$((RANDOM % 100 + 1))# 初始化游戏状态和猜测次数
game_over=false
guesses=0echo "欢迎来到猜数游戏!"while [ "$game_over" = false ]; doread -p "请猜一个1到100之间的数字:" guess((guesses++))  # 猜测次数加1# 检查猜测与随机数的比较if ((guess == secret_number)); thenecho "恭喜你,猜对了!你用了 $guesses 次猜测。"game_over=trueelif ((guess < secret_number)); thenecho "太小了,请再猜一次。"elseecho "太大了,请再猜一次。"fi
done

7. 问答游戏

#!/bin/bash
# 作者:mufenggrow# 定义问题和答案的关联数组
declare -A questions=(["什么语言出现在猫的声音中?"]="喵喵"["什么东西一次一半,永远都吃不完?"]="水"["最大的国家是哪个国家?"]="俄罗斯"
)# 初始化游戏状态和得分
game_over=false
score=0echo "欢迎来到问答游戏!"while [ "$game_over" = false ]; do# 随机选择一个问题question_index=$((RANDOM % ${#questions[@]}))question="${!questions[@]:$question_index:1}"answer="${questions[$question]}"echo "问题:$question"read -p "请输入你的答案:" user_answer# 检查答案是否正确if [ "$user_answer" = "$answer" ]; thenecho "回答正确!"((score++))  # 得分加1elseecho "回答错误。正确答案是:$answer"fi# 检查是否还有未回答的问题if [ ${#questions[@]} -eq $score ]; thenecho "恭喜你,回答完所有问题!你的得分是 $score 分。"game_over=trueelseecho "========================"read -p "继续游戏?(输入 q 退出,其他键继续):" continue_gameif [ "$continue_game" = "q" ]; thenecho "游戏结束。你的得分是 $score 分。"game_over=truefifi
done

拓展 :shell脚本中表示递增有几种写法

  1. 使用 let 命令:
counter=1
let counter=counter+1

这种方式使用 let 命令对变量 counter 进行递增操作。

  1. 使用双括号 (( )):
counter=1
(( counter++ ))

这种方式使用双括号 (()) 对变量 counter 进行递增操作,使用 ++ 表示递增。

  1. 使用 expr 命令:
counter=1
counter=$(expr $counter + 1)

这种方式使用 expr 命令进行算术运算,将结果赋值给变量 counter。

  1. 使用 $(( )):
counter=1
counter=$(( counter + 1 ))

这种方式使用 $(( )) 对变量 counter 进行递增操作,将结果赋值给 counter。

  1. 使用 +=:
counter=1
counter+=1

这种方式使用 += 对变量 counter 进行递增操作。

总结

以上就是今天的全部内容,主要讲解了while循环的使用,后期会介绍一些综合性的项目,我是沐风晓月,期待与你一起成长。

【shell脚本】沐风晓月跟你聊聊shell脚本中的while循环相关推荐

  1. 【shell脚本】沐风晓月跟你聊聊shell脚本中的case实战

    前言 前面我们已经介绍了while及for循环,结合if语句可以构建一些简单的控制面板及菜单脚本,今天我们来探讨下case语句. case选择语句,主要用于对多个选择条件进行匹配输出,与if elif ...

  2. 【shell脚本】沐风晓月跟你聊聊for循环中的那些事

    前言 跟晓月一起学shell,死磕shell脚本,让shell脚本学习不再难. 想学习更多shell脚本的案例,可以前往我的师父的shell脚本专栏:shell脚本从入门到实战-案例篇 文章目录 前言 ...

  3. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)

    1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...

  4. 用shell写了一个自动编译代码的脚本

    点击打开链接 为了充分利用晚上的时间进行编译,用shell写了一个自动编译代码的脚本,这样保证第二天的调试工作不会受大版本编译的影响,同时也能监测服务器端的代码是否出错.我习惯是在每天下班离开之前运行 ...

  5. 面向dba的linux shell 脚本简介,面向 DBA 的 Linux Shell 脚本简介

    DBA:Linux 面向 DBA 的 Linux Shell 脚本简介 作者:CasimirSaternos 学习一些在 Linux 上安装.运行和维护 Oracle 数据库所需的基本 bash sh ...

  6. shell脚本编译规范(编写第一个脚本,脚本变量的作用,类型 ,了解read命令,let命令,环境变量和预定义变量)

    文章目录 shell脚本编译规范 shell脚本应用场景 shell编程规范 编写第一个脚本 执行脚本文件四种方法 echo输出友好提示信息 管道与重定向 管道操作符号"|" sh ...

  7. shell脚本详解(一)——Shell编程规范与变量

    详解Shell编程规范与变量 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官" 二.用户的登录shell ...

  8. 会linux基本命令是脚本语言吗,如何理解Linux Shell和基本Shell脚本语言?

    理解Linux Shell: shell:一个命令行解释器,通过执行命令或脚本,帮助用户与操作系统打交道. process:进程,用户执行的任务是进程,但进程不只是任务. file:文件放在硬盘上,包 ...

  9. linux脚本里调执行命令,使用shell的-n/-x/-x执行选项调试Shell脚本

    我们在前面介绍的调试手段是通过修改shell脚本的源代码,从其输出相关的调试信息来定位错误的,那有没有不修改源代码来调试shell脚本的方法呢?有的,那就是使用shell的执行选项,下面将介绍一些常用 ...

最新文章

  1. 常用数据增广方法,解决数据单一问题
  2. 工作10年从大公司离职去小公司当CTO,被同事鄙视竟然不回netty
  3. python2 python3编码_Python2和Python3编码问题-从底层出发
  4. 树莓派基于 Linux 的 Windows XP 现已可用
  5. IT员工应该向谁汇报工作,CFO or CEO?
  6. SAP中smartforms参数
  7. iOS开发点击UIButton实现UIView的旋转
  8. 谈一谈flex布局使用中碰到的一些问题
  9. 全球首家!比亚迪宣布停止燃油汽车整车生产
  10. MySQL中的基本SQL语句
  11. 如何修改Maven本地仓库位置
  12. 计算机专业英语第六版考试试卷,计算机专业英语试题及答案(A卷)
  13. JavaSE实现汽车租赁系统
  14. matlab 求不规则体积,matlab,求不规则三维图形体积?
  15. IMU与GPS传感器ESKF融合定位
  16. 查询一段时间内的具体时间
  17. Centos显示“用户名不在sudoers文件中,此事将被报告”
  18. C语言基础——1024我把函数献给你
  19. 京东云智臻链开源两周年,JD Chain领跑国内自研区块链技术
  20. 3211. 【SDOI2013】随机数生成器

热门文章

  1. Windows监控:基于Prometheus+Grafana监控CPU、内存、磁盘、网络、GPU信息
  2. java中flatMap用法
  3. word插页码 目录不同编号
  4. java set遍历及效率_Java Set集合的遍历及实现类的比较
  5. QT学习开发笔记(项目实战之智能家居物联 UI 界面开发 )
  6. 洛谷 3393 逃离僵尸岛
  7. Spring Cloud Config 配置的加密解密
  8. 苹果哪几个型号无服务器,苹果手机有哪几款值得入手的型号,看看这几款准没错...
  9. HTML5的placeHolder在IE9下workaround引发的Bug(按下葫芦起了瓢)
  10. Gazebo仿真UUV水下机器人