文章目录
前言:脚本的目标与分析
脚本的目标:
实现一个类似于上课点名的抽奖脚本,抽过的人在本轮中不会重复出现,直到抽完为止,且抽完所有人后自动开始重新抽取。
脚本的分析:
由目标可知,脚本需要具备的主要功能为以下几点:
1.实现简单的抽奖功能
2.抽奖每轮不重复
3.抽完一轮后自动重新开始
抽奖功能我们可以用随机数RANDOM来实现,假如一个班有50个同学,则在文件内对应50个编号,我们可以用((RANDOM%50 + 1))来随机出这50个编号(RANDOM%50求余可以得出0到49的随机数,我们在此基础上加一即可得到1~50的随机数),而抽到的编号我们可以在另一个文件内记录,之后每次判断随机数是否在抽过的编号文件内出现,如果没有出现则代表这个同学没有被抽过。
而抽完之后自动重新开始这个功能我们可以先判断所有同学是否都被抽到过,只要我们确保每个同学不会被重复选取则当两个文件内容数量相等,则代表着所有同学都被抽过一次了。然后只要我们把抽过名单清空,则可以开始新一轮抽奖。
一、 实现脚本的大致步骤
脚本环境:
centos7 bash 4.2.46(2)-release (x86_64-redha
t-linux-gnu) vim编辑器
step1:文件的建立
我们先创建一个用于测试的名单文件name.txt并往里面输入几个名字
cat >> name.txt <<EOF
> 刘一
> 陈二
> 张三
> 李四
> 王五
> 赵六
> 孙七
> 周八
> 吴九
> 郑十
> EOF
step2:抽奖功能的实现
先完成一个基础的抽奖:
因为名单内的名字都是以行为单位的,我们可以认为,总行数即为总人数,我们可以用cat和wc -l 的组合命令求得总人数,同理可以求出被抽过的人数。我们用num_total来表示总人数。用num_lucky来表示被抽过的人数。
num_total=$(cat name.txt|wc -l) #定义num_total为抽奖的总人数
num_lucky=$(cat lucky.txt|wc -l) #定义num_lucky为被抽过的人数
因此我们需要1~num_total的随机数num,即
num=$((RANDOM%(num_total)+1))
然后我们可以用head和tail语句定位那个随机编号num
cat name.txt|head -$num|tail -1
#假设num=5,则上述输出的是头五行的