【shell脚本】沐风晓月跟你聊聊shell脚本中的while循环
前言
上篇文章我们探讨了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脚本中表示递增有几种写法
- 使用 let 命令:
counter=1
let counter=counter+1
这种方式使用 let 命令对变量 counter 进行递增操作。
- 使用双括号 (( )):
counter=1
(( counter++ ))
这种方式使用双括号 (()) 对变量 counter 进行递增操作,使用 ++ 表示递增。
- 使用 expr 命令:
counter=1
counter=$(expr $counter + 1)
这种方式使用 expr 命令进行算术运算,将结果赋值给变量 counter。
- 使用 $(( )):
counter=1
counter=$(( counter + 1 ))
这种方式使用 $(( )) 对变量 counter 进行递增操作,将结果赋值给 counter。
- 使用 +=:
counter=1
counter+=1
这种方式使用 += 对变量 counter 进行递增操作。
总结
以上就是今天的全部内容,主要讲解了while循环的使用,后期会介绍一些综合性的项目,我是沐风晓月,期待与你一起成长。
【shell脚本】沐风晓月跟你聊聊shell脚本中的while循环相关推荐
- 【shell脚本】沐风晓月跟你聊聊shell脚本中的case实战
前言 前面我们已经介绍了while及for循环,结合if语句可以构建一些简单的控制面板及菜单脚本,今天我们来探讨下case语句. case选择语句,主要用于对多个选择条件进行匹配输出,与if elif ...
- 【shell脚本】沐风晓月跟你聊聊for循环中的那些事
前言 跟晓月一起学shell,死磕shell脚本,让shell脚本学习不再难. 想学习更多shell脚本的案例,可以前往我的师父的shell脚本专栏:shell脚本从入门到实战-案例篇 文章目录 前言 ...
- Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)
1. 使用多个命令 如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. $ date ; who Mon Feb 21 15:36:09 EST 2014 Christine tty2 ...
- 用shell写了一个自动编译代码的脚本
点击打开链接 为了充分利用晚上的时间进行编译,用shell写了一个自动编译代码的脚本,这样保证第二天的调试工作不会受大版本编译的影响,同时也能监测服务器端的代码是否出错.我习惯是在每天下班离开之前运行 ...
- 面向dba的linux shell 脚本简介,面向 DBA 的 Linux Shell 脚本简介
DBA:Linux 面向 DBA 的 Linux Shell 脚本简介 作者:CasimirSaternos 学习一些在 Linux 上安装.运行和维护 Oracle 数据库所需的基本 bash sh ...
- shell脚本编译规范(编写第一个脚本,脚本变量的作用,类型 ,了解read命令,let命令,环境变量和预定义变量)
文章目录 shell脚本编译规范 shell脚本应用场景 shell编程规范 编写第一个脚本 执行脚本文件四种方法 echo输出友好提示信息 管道与重定向 管道操作符号"|" sh ...
- shell脚本详解(一)——Shell编程规范与变量
详解Shell编程规范与变量 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官" 二.用户的登录shell ...
- 会linux基本命令是脚本语言吗,如何理解Linux Shell和基本Shell脚本语言?
理解Linux Shell: shell:一个命令行解释器,通过执行命令或脚本,帮助用户与操作系统打交道. process:进程,用户执行的任务是进程,但进程不只是任务. file:文件放在硬盘上,包 ...
- linux脚本里调执行命令,使用shell的-n/-x/-x执行选项调试Shell脚本
我们在前面介绍的调试手段是通过修改shell脚本的源代码,从其输出相关的调试信息来定位错误的,那有没有不修改源代码来调试shell脚本的方法呢?有的,那就是使用shell的执行选项,下面将介绍一些常用 ...
最新文章
- 常用数据增广方法,解决数据单一问题
- 工作10年从大公司离职去小公司当CTO,被同事鄙视竟然不回netty
- python2 python3编码_Python2和Python3编码问题-从底层出发
- 树莓派基于 Linux 的 Windows XP 现已可用
- IT员工应该向谁汇报工作,CFO or CEO?
- SAP中smartforms参数
- iOS开发点击UIButton实现UIView的旋转
- 谈一谈flex布局使用中碰到的一些问题
- 全球首家!比亚迪宣布停止燃油汽车整车生产
- MySQL中的基本SQL语句
- 如何修改Maven本地仓库位置
- 计算机专业英语第六版考试试卷,计算机专业英语试题及答案(A卷)
- JavaSE实现汽车租赁系统
- matlab 求不规则体积,matlab,求不规则三维图形体积?
- IMU与GPS传感器ESKF融合定位
- 查询一段时间内的具体时间
- Centos显示“用户名不在sudoers文件中,此事将被报告”
- C语言基础——1024我把函数献给你
- 京东云智臻链开源两周年,JD Chain领跑国内自研区块链技术
- 3211. 【SDOI2013】随机数生成器
热门文章
- Windows监控:基于Prometheus+Grafana监控CPU、内存、磁盘、网络、GPU信息
- java中flatMap用法
- word插页码 目录不同编号
- java set遍历及效率_Java Set集合的遍历及实现类的比较
- QT学习开发笔记(项目实战之智能家居物联 UI 界面开发 )
- 洛谷 3393 逃离僵尸岛
- Spring Cloud Config 配置的加密解密
- 苹果哪几个型号无服务器,苹果手机有哪几款值得入手的型号,看看这几款准没错...
- HTML5的placeHolder在IE9下workaround引发的Bug(按下葫芦起了瓢)
- Gazebo仿真UUV水下机器人