tongtong
(拉勾学委-通通)
1
有空白的代码
#!/bin/bash
#bug 1
#seeds=`cat wx.txt`
#sed method
seeds=`sed -Ee 's/\s/,/g' wx.txt`
#wilie method
#seeds=`while read line; do echo ${line// /..}; done < wx.txt`
count=100
rand(){
while [ $count -ne 1 ] ; do
seeds=`for seed in $seeds ;do (( $RANDOM%2==0 )) && echo $seed; done`
count=`echo "$seeds" | wc -l`
count=$(($count+0))
done
echo $seeds
}
rand
代码思想:这段代码是想实现从wx.txt拿出数据,然后最终随机选出一位幸运观众,但是每次运行会概率性出现空白,也就是没有人被选出来的尴尬情况
思路
- 先读取到wx.txt全部数据,存放在seeds上
- 给一个计数器count,当seeds的count值等于1,才输出最后seeds的值
- 新的seeds值在for循环中,使用$RANDOM随机变量,这样,每个读取的名字,都会被随机的保留或者去除掉
- seeds的值会越来越小,因为新的seeds值都会被$RANDOM随机刷掉
- 当while循环中,count=1时,seeds的值也剩下一个了(一行)整个循环才会结束,就会打印最终的只有一个名字的seeds值了
具体的技术细节
-
seeds=`cat wx.txt`
- 反引号的作用是把cat wx.txt命令执行后在的结果赋值给seeds
- 有个问题,如果wx.txt有人名包含空格,比如"tong tong",最终打印运行完代码,打印的seeds值就是tong,而不是"tong tong"
- 解决的方法就是替换空格
-
seeds=`sed -Ee 's/\s/,/g' wx.txt`
- sed中的s//g的方法就可以把空格(\s)替换成",",后面有一个g,是把一行中全部的空格都换成逗号
- sed -eE是不对的写法,-Ee才是正确的写法
-
seeds=`while read line; do echo ${line// /..}; done < wx.txt`
-
while [ $count -ne 1 ]
- 我的实现方式和老师不一样,[] 表示里面只能是数字的对比,所以$count和1都必须是数字才行
- 老师是使用[[ $count == 1 ]],[[]]表示的是字符串的对比
- 如果count一开始不赋值,那么count会默认一个非数字的值,所以在while [ $count -ne 1 ]的代码之前,加上count=100,只要count不是1都行
-
seeds=`for seed in $seeds ;do (( $RANDOM%2==0 )) && echo $seed; done`
- 需要注意这里的执行顺序,是先把for seed in $seeds ;do (( $RANDOM%2==0 )) && echo $seed; done的命令执行了,输出了内容之后,再把内容全部赋值给seeds
- 下面的执行效果就告诉我们,执行了for((i=0;i<3;i++)); do echo i ;done 屏幕打印了全部的值,然后再把这些值赋给a
- echo “$a” 才会按照行来打印a的值,echo $a 打印的每个值都用空格隔开显示,只显示一行
[root@VM_0_8_centos shizhan]# for((i=0;i<3;i++)); do echo $i ;done
0
1
2
[root@VM_0_8_centos shizhan]# a=`for((i=0;i<3;i++)); do echo $i ;done`
[root@VM_0_8_centos shizhan]# echo "$a"
0
1
2
[root@VM_0_8_centos shizhan]# echo $a
0 1 2