本帖最后由 彭 于 2015-8-15 22:35 编辑
1、写一个脚本执行后,输入名字,产生随机数01-99之间的数字。
2、如果相同的名字重复输入,抓到的数字还是第一次抓取的结果,
3、前面已经抓到的数字,下次不能在出现相同数字。
4、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出
继续等待别的学生输入。
1、写一个脚本执行后,输入名字,产生随机数01-99之间的数字。
2、如果相同的名字重复输入,抓到的数字还是第一次抓取的结果,
3、前面已经抓到的数字,下次不能在出现相同数字。
4、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出
继续等待别的学生输入。
0
经过测试,这个脚本基本没有错误,满足要求,脚本如下:
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
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
我发一个python版本的
- #!/usr/bin/env python
- # coding=utf-8
- import random
- import tab
- import sys
- def cache(input,namedict,num):
- if input in namedict:
- print '%s:' %input ,namedict[input], 'hit'
- elif num in range(1,10):
- new_num = '0' + '%s' %num
- decide_list.append(num)
- namedict[input] = new_num
- else:
- namedict[input] = num
- decide_list.append(num)
- namedict = {}
- decide_list = []
- while True:
- try:
- input = raw_input('请输入一个名字:')
- except KeyboardInterrupt:
- sys.exit('\n')
- num = random.randint(01,10)
- if num not in decide_list:
- cache(input,namedict,num)
- with open('/home/test.txt','a') as f:
- f.write(input + ':' + str(namedict[input])+'\n')
- print '%s:'%input,namedict[input]
- else:
- print '抓取数字重复,请重新输入'
0
没有问题,你输入出现不同的上数字,是因为,我脚本中的/work/test/1.log这个文件不存在吧,所以你要先:
mkdir -p /work/test;touch /work/test/1.log。因为这个文件是存储已经获取到数字的,没有这个文件,当然没办法判断已经存在了。
lky 发表于 2015-9-15 16:10
这个貌似有点问题呀,我输入相同的名字每次都会出现不同的数字
没有问题,你输入出现不同的上数字,是因为,我脚本中的/work/test/1.log这个文件不存在吧,所以你要先:
mkdir -p /work/test;touch /work/test/1.log。因为这个文件是存储已经获取到数字的,没有这个文件,当然没办法判断已经存在了。
0
我试试看先{:4_116:}
Armani 发表于 2015-9-24 13:53
没有问题,你输入出现不同的上数字,是因为,我脚本中的/work/test/1.log这个文件不存在吧,所以你要先: ...
我试试看先{:4_116:}
0
- #! /bin/bash
- if [[ ! -f ./rand.txt ]];then
- touch ./rand.txt
- fi
- while :;do
- read -p "Please input your name:" name
- n=`egrep "^${name}$" ./rand.txt||echo "true"`
- if [[ $n != "true" ]];then
- echo "You have a number!"
- continue
- fi
- n="flase"
- while [[ $n != "true" ]];do
- num=`echo $[$RANDOM%99+1]`
- n=`egrep "${num}" ./rand.txt||echo "true"`
- done
- echo "${name} ${num}" >> ./rand.txt
- echo "Your number is ${num}"
- read -p "Are you continue? yes or no:" panduan
- if [[ $panduan == "no" ]];then
- break
- fi
- done
0
#!/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
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
Armani 发表于 2015-8-26 23:52
经过测试,这个脚本基本没有错误,满足要求,脚本如下:
while :
do
- [root@master shell]# echo $RANDOM | awk -F "" '{print $2 $3}'
- 00
- [root@master shell]# echo 10004 | awk -F "" '{print $2 $3}'
- 00
0
本帖最后由 xueyongbo 于 2015-12-8 19:46 编辑
- #!/bin/bash
- # 2015/12/8 17:00
- # By xueyongbo
- read -p "input your name :" name
- record=/tmp/random.txt
- while :
- do
- if [ -f $record ];then
- if [ -z $(grep "$name" $record) ];then
- num=$(($RANDOM%100))
- if [ -z $(grep "$num" $record) ];then
- echo -e "$name\t$num" >> $record
- break
- elif [ $(wc -l $record) -ge 99 ]
- echo "抽签人数已经超过99人。。"
- else
- read -p "the number exist, input your name again :" name
- fi
- else
- read -p "input your name again :" name
- fi
- else
- touch /tmp/random.txt
- fi
- done
0
#!/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
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
{:6_151:}我发一个
- #!/bin/bash
- while :
- do
- namet='';
- numt='';
- read -p "请输入你的名字:" name
- if [ -f ./cqjg.txt ]
- then
- namet=`awk '{print $1}' ./cqjg.txt | grep $name`;
- fi
- if [[ $namet = $name ]]
- then
- echo -e "姓名重复,\c";
- continue;
- else
- num=$[$RANDOM%99+1]
- if [ -f ./cqjg.txt ]
- then
- numt=`awk '{print $2}' ./cqjg.txt | grep $num`
- fi
- if [[ $numt -eq $num ]]
- then
- echo -e "数字重复,\c";
- continue;
- else
- echo $name' '$num >>./cqjg.txt;
- fi
- fi
- done
0
本帖最后由 loveyouhyf 于 2016-1-14 11:02 编辑
脚本有问题,看上面的代码,应该是对于重复的人直接就不能再次抽签,你的这个脚本依然可以再抽。
Armani 发表于 2015-8-26 23:52
经过测试,这个脚本基本没有错误,满足要求,脚本如下:
while :
do
- [root@bbs ~]# sh chouqian1.sh
- Please input a name:a
- a:01
- Please input a name:a1
- a1:55
- Please input a name:a2
- a2:19
- Please input a name:a1
- 55
- 重复名字.
- Please input a name:a
- a:76
- Please input a name:a
- 数字已存在.
- a:21
- Please input a name:a1
- 55
- 重复名字.
- Please input a name:^C
- [root@bbs ~]# cat /work/test/1.log
- a:01
- a1:55
- a2:19
- a:76
- a:21
脚本有问题,看上面的代码,应该是对于重复的人直接就不能再次抽签,你的这个脚本依然可以再抽。
0
除了$RANDOM那边有点小小的问题,其他是没有问题的,仔细看题目意思,这是快半年前写的脚本了,懒得再改了。
loveyouhyf 发表于 2016-1-14 10:53
脚本有问题,看上面的代码,应该是对于重复的人直接就不能再次抽签,你的这个脚本依然可以再抽。
...
除了$RANDOM那边有点小小的问题,其他是没有问题的,仔细看题目意思,这是快半年前写的脚本了,懒得再改了。
0
本帖最后由 loveyouhyf 于 2016-1-14 12:57 编辑
哈哈,当我没说
Armani 发表于 2016-1-14 11:14
除了$RANDOM那边有点小小的问题,其他是没有问题的,仔细看题目意思,这是快半年前写的脚本了,懒得再改 ...
哈哈,当我没说
0
根据25楼的验证,说明你的脚本在判断名字是否重复时没有精确匹配,所以出现25楼的情况,应该用grep -w,,grep “$name”的意思是过滤出包含某字段的行,是包含,不是等于。
Armani 发表于 2016-1-14 11:14
除了$RANDOM那边有点小小的问题,其他是没有问题的,仔细看题目意思,这是快半年前写的脚本了,懒得再改 ...
根据25楼的验证,说明你的脚本在判断名字是否重复时没有精确匹配,所以出现25楼的情况,应该用grep -w,,grep “$name”的意思是过滤出包含某字段的行,是包含,不是等于。
0
{:7_184:} 是的
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
编辑回复