抽签脚本

回复 收藏
本帖最后由 彭 于 2015-8-15 22:35 编辑

1、写一个脚本执行后,输入名字,产生随机数01-99之间的数字。
2、如果相同的名字重复输入,抓到的数字还是第一次抓取的结果,
3、前面已经抓到的数字,下次不能在出现相同数字。
4、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出
继续等待别的学生输入。
2015-08-15 22:32 举报
已邀请:
0

疾风

赞同来自:

用python写么?
0

赞同来自:


用shell...python你会也行
0

Linuxpp

赞同来自:

学习
0

Armani

赞同来自:

经过测试,这个脚本基本没有错误,满足要求,脚本如下:
while :
do
read -p  "Please input a name:" name
  if [ -f /work/test/1.log ];then
     bb=`cat /work/test/1.log | awk -F: '{print $1}' | grep "$name"`

     if [ "$bb" != "$name" ];then  #名字不重复情况下
        aa=`echo $RANDOM | awk -F "" '{print $2 $3}'`
         while :
          do
       dd=`cat  /work/test/1.log |  awk -F: '{print $2}'  | grep "$aa"`
          if [ "$aa"  ==  "$dd" ];then   #数字已经存在情况下
            echo "数字已存在."
            aa=`echo $RANDOM | awk -F "" '{print $2 $3}'`
           else
            break
          fi
          done
        echo "$name:$aa" | tee -a /work/test/1.log
     else
     aa=`cat /work/test/1.log |  grep "$name" | awk -F: '{print $2}'` #名字重复
       echo $aa
       echo "重复名字."
     fi
  else
      aa=`echo $RANDOM | awk -F "" '{print $2 $3}'`
      echo "$name:$aa" | tee -a  /work/test/1.log
  fi
done
0

wangdi244

赞同来自:

我发一个python版本的
  1. #!/usr/bin/env python
  2. # coding=utf-8

  3. import random
  4. import tab
  5. import sys


  6. def cache(input,namedict,num):
  7.     if input in namedict:
  8.         print  '%s:' %input ,namedict[input], 'hit'
  9.     elif num in range(1,10):
  10.         new_num = '0' + '%s' %num
  11.         decide_list.append(num)
  12.         namedict[input] = new_num
  13.     else:
  14.         namedict[input] = num
  15.         decide_list.append(num)


  16. namedict = {}
  17. decide_list = []
  18. while True:
  19.     try:
  20.         input = raw_input('请输入一个名字:')
  21.     except KeyboardInterrupt:
  22.         sys.exit('\n')
  23.     num = random.randint(01,10)
  24.     if num not in decide_list:
  25.     cache(input,namedict,num)
  26.     with open('/home/test.txt','a') as f:
  27.         f.write(input + ':' + str(namedict[input])+'\n')
  28.         print '%s:'%input,namedict[input]
  29.     else:
  30.     print '抓取数字重复,请重新输入'



0

Linuxpp

赞同来自:

难不难
0

lky

赞同来自:

Armani 发表于 2015-8-26 23:52
经过测试,这个脚本基本没有错误,满足要求,脚本如下:
while :
do

这个貌似有点问题呀,我输入相同的名字每次都会出现不同的数字
0

Armani

赞同来自:

lky 发表于 2015-9-15 16:10
这个貌似有点问题呀,我输入相同的名字每次都会出现不同的数字

没有问题,你输入出现不同的上数字,是因为,我脚本中的/work/test/1.log这个文件不存在吧,所以你要先:
mkdir  -p  /work/test;touch /work/test/1.log。因为这个文件是存储已经获取到数字的,没有这个文件,当然没办法判断已经存在了。
0

lky

赞同来自:

Armani 发表于 2015-9-24 13:53
没有问题,你输入出现不同的上数字,是因为,我脚本中的/work/test/1.log这个文件不存在吧,所以你要先: ...

我试试看先{:4_116:}
0

tkk

赞同来自:

学习学习
0

zql254

赞同来自:

  1. #! /bin/bash

  2. if [[ ! -f ./rand.txt ]];then
  3. touch ./rand.txt
  4. fi
  5. while :;do
  6. read -p "Please input your name:" name
  7. n=`egrep "^${name}$" ./rand.txt||echo "true"`
  8. if [[ $n != "true" ]];then
  9. echo "You have a number!"
  10. continue
  11. fi
  12. n="flase"
  13. while [[ $n != "true" ]];do
  14.   num=`echo $[$RANDOM%99+1]`
  15.   n=`egrep "${num}" ./rand.txt||echo "true"`
  16.   done
  17.       echo "${name}     ${num}" >> ./rand.txt
  18.       echo "Your number is ${num}"  
  19.   read -p "Are you continue? yes or no:" panduan
  20.   if [[ $panduan == "no" ]];then
  21.   break
  22.   fi
  23. done
0

oneliang

赞同来自:

看看
0

Shawn

赞同来自:

。。。。。。
0

Shawn

赞同来自:

。。。。。。
0

Shawn

赞同来自:

。。。。。。。。。。。。。。。。。。。
0

Shawn

赞同来自:

Armani 发表于 2015-8-26 23:52
经过测试,这个脚本基本没有错误,满足要求,脚本如下:
while :
do

太厉害了。我看都看不懂唉
0

demon_l

赞同来自:

#!/bin/bash
while :
do
    touch /root/name_num.txt
    file=/root/name_num.txt
    read -p "please input your name:" name
    grep $name $file
    if [ $? -eq 1 ] ;then
        while [ $? -eq 0 ]
        do
            num=$RANDOM
            grep $num $file > /dev/null
        done
        echo "$name: $num"
        echo "$name: $num" >> $file
    fi
done
0

Linuxpp

赞同来自:

出来了
0

汤小东

赞同来自:

learn
0

xueyongbo

赞同来自:

Armani 发表于 2015-8-26 23:52
经过测试,这个脚本基本没有错误,满足要求,脚本如下:
while :
do
  1. [root@master shell]# echo $RANDOM | awk -F "" '{print $2 $3}'
  2. 00
  3. [root@master shell]# echo 10004 | awk -F "" '{print $2 $3}'
  4. 00

0

xueyongbo

赞同来自:

本帖最后由 xueyongbo 于 2015-12-8 19:46 编辑
  1. #!/bin/bash

  2. # 2015/12/8 17:00
  3. # By xueyongbo

  4. read -p "input your name :" name

  5. record=/tmp/random.txt


  6. while :
  7. do
  8.         if [ -f $record ];then
  9.                 if [ -z $(grep "$name" $record) ];then
  10.                         num=$(($RANDOM%100))
  11.                         if [ -z $(grep "$num" $record) ];then
  12.                                 echo -e "$name\t$num" >> $record
  13.                                 break
  14.                         elif [ $(wc -l $record) -ge 99 ]
  15.                                 echo "抽签人数已经超过99人。。"
  16.                         else
  17.                                 read -p "the number exist, input your name again :" name
  18.                         fi
  19.                 else
  20.                         read -p "input your name again :" name

  21.                 fi
  22.         else
  23.                 touch /tmp/random.txt
  24.         fi
  25. done


0

hlymlv

赞同来自:

#!/bin/bash
while :;do
read -p "please enter your name:" n
if [ $n == "quit" ];then
echo "Bye."
exit
fi
number=$[$RANDOM%99+1]
echo $number >>number.log
m=`grep -E "^$number$" number.log|sort|uniq -c|awk '{print $1}'`
if [ "$m" -gt 1 ];then
number=$[$RANDOM%99+1]
else
echo "$n's number is:$number"
echo "$n:$number" >>1.txt
fi
done
0

maria

赞同来自:

{:6_151:}我发一个
  1. #!/bin/bash
  2. while :
  3. do
  4. namet='';
  5. numt='';
  6. read -p "请输入你的名字:" name
  7. if [ -f ./cqjg.txt ]
  8. then
  9.     namet=`awk '{print $1}' ./cqjg.txt | grep $name`;
  10. fi
  11. if [[ $namet = $name ]]
  12. then
  13.     echo -e "姓名重复,\c";
  14.     continue;
  15. else
  16.     num=$[$RANDOM%99+1]
  17.     if [ -f ./cqjg.txt ]
  18.     then
  19.         numt=`awk '{print $2}' ./cqjg.txt | grep $num`
  20.     fi
  21.     if [[ $numt -eq $num ]]
  22.     then
  23.         echo -e "数字重复,\c";
  24.         continue;
  25.     else
  26.         echo $name' '$num >>./cqjg.txt;
  27.     fi
  28. fi
  29. done
0

loveyouhyf

赞同来自:

本帖最后由 loveyouhyf 于 2016-1-14 11:02 编辑
Armani 发表于 2015-8-26 23:52
经过测试,这个脚本基本没有错误,满足要求,脚本如下:
while :
do
  1. [root@bbs ~]# sh chouqian1.sh
  2. Please input a name:a
  3. a:01
  4. Please input a name:a1
  5. a1:55
  6. Please input a name:a2
  7. a2:19
  8. Please input a name:a1
  9. 55
  10. 重复名字.
  11. Please input a name:a
  12. a:76
  13. Please input a name:a
  14. 数字已存在.
  15. a:21
  16. Please input a name:a1
  17. 55
  18. 重复名字.
  19. Please input a name:^C
  20. [root@bbs ~]# cat /work/test/1.log
  21. a:01
  22. a1:55
  23. a2:19
  24. a:76
  25. a:21


脚本有问题,看上面的代码,应该是对于重复的人直接就不能再次抽签,你的这个脚本依然可以再抽。



0

Armani

赞同来自:

loveyouhyf 发表于 2016-1-14 10:53
脚本有问题,看上面的代码,应该是对于重复的人直接就不能再次抽签,你的这个脚本依然可以再抽。

...

除了$RANDOM那边有点小小的问题,其他是没有问题的,仔细看题目意思,这是快半年前写的脚本了,懒得再改了。
0

loveyouhyf

赞同来自:

本帖最后由 loveyouhyf 于 2016-1-14 12:57 编辑
Armani 发表于 2016-1-14 11:14
除了$RANDOM那边有点小小的问题,其他是没有问题的,仔细看题目意思,这是快半年前写的脚本了,懒得再改 ...

哈哈,当我没说
0

wzwyql

赞同来自:

Armani 发表于 2016-1-14 11:14
除了$RANDOM那边有点小小的问题,其他是没有问题的,仔细看题目意思,这是快半年前写的脚本了,懒得再改 ...

根据25楼的验证,说明你的脚本在判断名字是否重复时没有精确匹配,所以出现25楼的情况,应该用grep -w,,grep “$name”的意思是过滤出包含某字段的行,是包含,不是等于。
0

loveyouhyf

赞同来自:

wzwyql 发表于 2016-1-14 16:32
根据25楼的验证,说明你的脚本在判断名字是否重复时没有精确匹配,所以出现25楼的情况,应该用grep -w, ...

{:7_184:} 是的
0

大雁

赞同来自:

脚步还不够完美,没有判断抽签人数多于100的情况,没有退出功能,只能crtl+c退出

#!/bin/bash

while :
do
  read -p "please input your name:" n
  m=$(($RANDOM0))
  if [ -f name.txt ]
  then
    a=`awk -F: '{print $1}' name.txt | grep $n`         ##查找名字
    b=`awk -F: '{if($1=="'$n'") print $2}' name.txt`    ##查找名字对应的抽签号
    if [ ! -z $a ]
    then
      m=$b
      echo "$n:$m"
    else
      while :
      do
        c=`awk -F: '{if($2=="'$m'") print $2}' name.txt`     ##查找抽签号是否已经存在

        if [ -z $c ]
        then
          echo "$n:$m" |tee -a name.txt
          break
        else
          m=$(($RANDOM0))
        fi
      done
    fi
  else
    echo "$n:$m" |tee -a name.txt
  fi
done

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: