查看原文
其他

shell编程之嵌套循环及随机数,你造吗?

景禹 景禹 2022-06-09

今日目标

  • 复习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个,每个一行。

① 思路

  1. 产生1000个电话号码,脚本需要循环1000次 FOR WHILE UNTIL

  2. 139+8位,后8位随机产生,可以让每一位数字都随机产生  echo $[$RANDOM%10]

  3. 将随机产生的数字分别保存到变量里,然后加上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位幸运观众

具体需求:

  1. 在上面的1000个手机号里抽奖5个幸运观众,显示出这5个幸运观众。

  2. 但只显示头3个数和尾号的4个数,中间的都用*代替

① 思路

  1. 确定幸运观众所在的行0-1000 随机找出一个数字 $[$RANDOM%1000+1]

  2. 将电话号码提取出来      head -随机产生行号 phonenum.txt |tail -1

  3. 显示前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个用户,每个用户的密码为一个随机数

① 思路

  1. 循环5次创建用户

  2. 产生一个密码文件来保存用户的随机密码(使用pwgen工具可产生随机密码)

  3. 从密码文件中取出随机密码赋值给用户

② 实现

#!/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格。循环嵌套就是外层循环一次,内层循环一轮。

  1. 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。

  2. 每次外部循环都会触发内部循环,直至内部循环完成,才接着执行下一次的外部循环。

  3. 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


推荐阅读

Shell编程之文本处理工具与bash的特性

SHELL编程之变量与四则运算

SHELL编程之条件判断和流程控制

SHELL编程之循环语句


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存