前言
上篇文章我们探讨了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
do
echo $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/bash
counter=1
while [ $counter -le 100 ]
do
echo $counter
counter=`expr $counter + 1`
done
expr 进行递增操作 counter = counter + 1
3.While循环求1-100的总和
#!/bin/bash
counter=1
sum=0
while [ $counter -le 100 ]
do
sum=$(expr $sum + $counter)
counter=$(expr $counter + 1)
done
echo "总和为: $sum"
4. 让用户在10s中内输入ip地址,并判断IP是否符合规范
#!/bin/bash
# 作者:mufenggrow
read -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)); then
echo "输入超时!"
break
fi
# 检查IP地址是否符合规范
if [[ $ip_address =~ $ip_regex ]]; then
echo "IP地址符合规范!"
break
else
echo "IP地址不符合规范,请重新输入:"
read -p "请输入IP地址:" ip_address
fi
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
# 作者:mufenggrow
while true; do
# 使用who命令获取当前登录的用户信息
logged_in_users=$(who | grep "mufenggrow")
# 检查是否有mufenggrow用户登录
if [ -n "$logged_in_users" ]; then
echo "mufenggrow用户已登录系统!"
else
echo "mufenggrow用户未登录系统。"
fi
# 等待10秒
sleep 10
done
6. 猜数字游戏
#!/bin/bash
# 作者:mufenggrow
# 生成一个1到100之间的随机数
secret_number=$((RANDOM % 100 + 1))
# 初始化游戏状态和猜测次数
game_over=false
guesses=0
echo "欢迎来到猜数游戏!"
while [ "$game_over" = false ]; do
read -p "请猜一个1到100之间的数字:" guess
((guesses++)) # 猜测次数加1
# 检查猜测与随机数的比较
if ((guess == secret_number)); then
echo "恭喜你,猜对了!你用了 $guesses 次猜测。"
game_over=true
elif ((guess < secret_number)); then
echo "太小了,请再猜一次。"
else
echo "太大了,请再猜一次。"
fi
done
7. 问答游戏
#!/bin/bash
# 作者:mufenggrow
# 定义问题和答案的关联数组
declare -A questions=(
["什么语言出现在猫的声音中?"]="喵喵"
["什么东西一次一半,永远都吃不完?"]="水"
["最大的国家是哪个国家?"]="俄罗斯"
)
# 初始化游戏状态和得分
game_over=false
score=0
echo "欢迎来到问答游戏!"
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" ]; then
echo "回答正确!"
((score++)) # 得分加1
else
echo "回答错误。正确答案是:$answer"
fi
# 检查是否还有未回答的问题
if [ ${#questions[@]} -eq $score ]; then
echo "恭喜你,回答完所有问题!你的得分是 $score 分。"
game_over=true
else
echo "========================"
read -p "继续游戏?(输入 q 退出,其他键继续):" continue_game
if [ "$continue_game" = "q" ]; then
echo "游戏结束。你的得分是 $score 分。"
game_over=true
fi
fi
done
shell_255">拓展 :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循环的使用,后期会介绍一些综合性的项目,我是沐风晓月,期待与你一起成长。