抽奖规则
共抽出6名获奖学员,1名50元,5名各10元。获奖同学在微信群里找班主任领取奖励。
wx.txt 文件路径
/tmp/wx.txt.zdh1
10元
secret よう..じょ 若 M.X.Y 叫我三胖就好
50元
。
正常的程序
rand(){
local count
local seeds
count=0
seeds=`while read line;do echo ${line// /..}; done < wx.txt`
while [[ $count != 1 ]];do
seeds=`for seed in $seeds;do (($RANDOM%2==0)) && echo $seed;done`
count=`echo "$seeds" | wc -l`
done
if [[ $seeds == "" ]];then
rand
elif [[ $seeds != "" ]];then
echo $seeds
fi
}
is_repeat(){
for arr in ${arrs[@]};do
if [[ $arr == $1 ]];then
echo 0
return 0
fi
done
echo 1
}
main(){
for i in `eval echo {1..$1}`;do
tmp=`rand`
while [[ `is_repeat $tmp` == 0 ]];do
tmp=`rand`
done
arrs[$i]=$tmp
done
echo ${arrs[@]}
}
main $1
有bug的程序
rand(){
local count
local seeds
local name1
local seed
count=0
name1=`while read line;do echo ${line// /..};done < wx.txt`
# name1 变量和seeds变量要一样,不然下面的while循环就会一直使用seeds变量的所有内容,内容就不会减少,造成死循环。while循环判断只有一行内容的时候才会停止循环。
while [[ $count != 1 ]];do
seeds=`for seed in $name1;do (($RANDOM%2==0)) && echo $seed;done`
echo $seed
# echo 打印$seeds值,没有添加双引号,所有的值都会放到一行里面,使用双引号就会每个值单独一行显示。
#count=`echo $seeds |wc -l`
count=`echo "$seeds" |wc -l`
#count=1
echo "还有多少学员:" $count
done
if [[ $seeds == "" ]];then
rand
elif [[ $seeds != "" ]];then
echo $seeds
fi
}
is_repeat(){
for arr in ${arrs[@]};do
if [[ $arr == $1 ]];then
echo 0
return 0
fi
done
echo 1
}
main(){
for i in `eval echo {1..$1}`;do
tmp=`rand`
while [[ `is_repeat $tmp` == 0 ]];do
tmp=`rand`
done
arrs[$i]=$tmp
done
echo ${arrs[@]}
}
main $1
问题1:变量命名问题,变量需要重复使用。
问题2:没有关注到echo "$seeds"
,与 echo $seeds
差别。