shell编程之嵌套循环及随机数,你造吗?
今日目标
复习for循环语句的基本语法结构
复习while和until循环语句的基本语法结构
能会使用RANDOM产生随机数
理解嵌套循环
每个人都会有自己的学习方式,对不同的人,选择适合自己的方式学习,我是一个笨人,回头复习对我个人而言就显得尤为重要,今日的复习对你若有帮助,请转发或者点个赞
一、随机数
关键词:一切都是未知数,永远不知道明天会发生什么,珍惜今日🎐😅
1. 如何生成随机数?
系统变量:RANDOM,默认会产生0~32767的随机整数
前言:要想调用变量,不管你是什么变量都要给钱,而且是美元$
# 打印一个随机数
echo $RANDOM
# 查看系统上一次生成的随机数
# set|grep RANDOM
RANDOM=28325
# 产生0~1之间的随机数
echo $[$RANDOM%2]
# 产生0~k之间的随机数
echo $[$RANDOM%(k+1)]
# 产生50-100之内的随机数
echo $[$RANDOM%51+50]
# 产生三位数的随机数 $RANDOM%900 产生0到899之间的随机数,+100则产生100至999
echo $[$RANDOM%900+100]
2. 实战案例
(一)随机产生以139开头的电话号码
具体需求1:
写一个脚本,产生一个phonenum.txt文件,随机产生以139开头的手机号1000个,每个一行。
① 思路
产生1000个电话号码,脚本需要循环1000次
FOR WHILE UNTIL
139+8位,后8位随机产生,可以让每一位数字都随机产生
echo $[$RANDOM%10]
将随机产生的数字分别保存到变量里,然后加上139保存到文件里
② 实现
#!/bin/env bash
#产生1000个以139开头的电话号码并保存文件phonenum.txt
file=/shell03/phonenum.txt
for ((i=1;i<=1000;i++))
do
n1=$[$RANDOM%10]
n2=$[$RANDOM%10]
n3=$[$RANDOM%10]
n4=$[$RANDOM%10]
n5=$[$RANDOM%10]
n6=$[$RANDOM%10]
n7=$[$RANDOM%10]
n8=$[$RANDOM%10]
echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> $file
done
#!/bin/bash
i=1
while [ $i -le 1000 ]
do
n1=$[$RANDOM%10]
n2=$[$RANDOM%10]
n3=$[$RANDOM%10]
n4=$[$RANDOM%10]
n5=$[$RANDOM%10]
n6=$[$RANDOM%10]
n7=$[$RANDOM%10]
n8=$[$RANDOM%10]
echo "139$n1$n2$n3$n4$n5$n6$n7$n8" >> phonenum.txt
let i++
done
continue:继续,跳过本次循环,执行下一次循环
break:打断,执行循环体外的代码do..done外
exit:退出程序
#!/bin/bash
i=1
until [ $i -gt 1000 ]
do
n1=$[$RANDOM%10]
n2=$[$RANDOM%10]
n3=$[$RANDOM%10]
n4=$[$RANDOM%10]
n5=$[$RANDOM%10]
n6=$[$RANDOM%10]
n7=$[$RANDOM%10]
n8=$[$RANDOM%10]
echo "139$n1$n2$n3$n4$n5$n6$n7$n8" |tee -a phonenum.txt && let i++
done
(二)随机抽出5位幸运观众
具体需求:
在上面的1000个手机号里抽奖5个幸运观众,显示出这5个幸运观众。
但只显示头3个数和尾号的4个数,中间的都用*代替
① 思路
确定幸运观众所在的行
0-1000 随机找出一个数字 $[$RANDOM%1000+1]
将电话号码提取出来
head -随机产生行号 phonenum.txt |tail -1
显示前3个和后4个数到屏幕
echo 139****
② 实现
#!/bin/bash
#定义变量
phone=./phonenum.txt
#循环抽出5位幸运观众
for ((i=1;i<=5;i++))
do
#定位幸运观众所在行号 wc将计算指定文件的行数、字数,以及字节数
line=`wc -l $phone | cut -d' ' -f1`
luck_line=$[RANDOM%$line+1]
#取出幸运观众所在行的电话号码
luck_num=`head -$luck_line $phone | tail -1`
#显示到屏幕
echo "139****${luck_num:7:4}"
echo $luck_num >> luck.txt
#删除已经被抽取的幸运观众号码
#sed -i "/$luck_num/d" $phone
done
(三)批量创建用户(密码随机产生)
需求:批量创建5个用户,每个用户的密码为一个随机数
① 思路
循环5次创建用户
产生一个密码文件来保存用户的随机密码(使用pwgen工具可产生随机密码)
从密码文件中取出随机密码赋值给用户
② 实现
#!/bin/bash
#crate user and set passwd
#产生一个保存用户名和密码的文件32767
echo user0{1..5}:itpwdf$[$RANDOM%9000+1000]jyu|tr ' ' '\n'>> user_pass.file
#循环创建5个用户
for ((i=1;i<=5;i++))
do
#取出用户名和密码
user=`head -$i user_pass.file|tail -1|cut -d: -f1`
pass=`head -$i user_pass.file|tail -1|cut -d: -f2`
#创建用户并设置密码
useradd $user
echo $pass|passwd --stdin $user
done
或者
for i in `cat user_pass.file`
do
user=`echo $i|cut -d: -f1`
pass=`echo $i|cut -d: -f2`
useradd $user
echo $pass|passwd --stdin $user
done
二、嵌套循环
关键字:大圈套小圈
🕒时钟:分针与秒针,秒针转一圈(60格),分针转1格。循环嵌套就是外层循环一次,内层循环一轮。
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。
每次外部循环都会触发内部循环,直至内部循环完成,才接着执行下一次的外部循环。
for循环、while循环和until循环可以相互嵌套。
打印九九乘法表(三种方法)
Y轴:循环9次,打印9行空行
X轴:循环次数和Y轴相关;打印的是X和Y轴乘积 $[] $(())
#!/bin/bash
for ((y=1;y<=9;y++))
do
for ((x=1;x<=$y;x++))
do
echo -ne "$x*$y=$[$x*$y]\t"
done
echo
echo
done
#!/bin/bash
y=1
while [ $y -le 9 ]
do
x=1
while [ $x -le $y ]
do
echo -ne "$x*$y=$[$x*$y]\t"
let x++
done
echo
echo
let y++
done
或者
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -ne "$j*$i=$[$i*$j]\t"
done
echo
echo
done
或者
#!/bin/bash
y=1
until [ $y -gt 9 ]
do
x=1
until [ $x -gt $y ]
do
echo -ne "$x*$y=$[ $x*$y ]\t"
let x++
done
echo
echo
let y++
done
推荐阅读