企业Shell面试题3:某项目学生实践抓阄案例
好消息,老男孩培训学生外出企业项目实践机会(第6次)来了(本月中旬),但是,名额有限,队员限3人(班长带队)。
因此需要挑选学生,因此需要一个抓阄的程序:
要求:
1、执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字。
2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别的学生输入。
#!/bin/bash
input(){
while true
do
read -p "pls input your name:" name
if [ -z $name ]
then
continue
elif [ $name == "0" ]
then
break
fi
rand=$((RANDOM%5))
[ -f /tmp/temp.txt ] && num=`cat temp.txt | awk '{print $1}'`
while true
do
if [[ $num =~ $rand ]];then
rand=$((RANDOM%5))
if [ $num2 -ge 4 ];then
output
exit 0
fi
continue
else
echo -e $rand"\t"$name >>/tmp/temp.txt
break
fi
done
num2=`cat temp.txt | awk '{print $1}' | wc -l`
done
}
output(){
cat /tmp/temp.txt | sort -nr | head -3 > result.txt
cat result.txt
}
main(){
input
}
main
说明下 脚本能用到的知识点:
RANDOM%5 随机数(1-32767)对5求余数 0 1 2 3 4
while true 无限循环
read -p “” 变量名 -----脚本交互
sort -nr 对数字进行降序 , 默认是升序
`` 反撇 是获取执行命令后的结果 或者用$(( 加命令))
补充:
双中括号[[]]是bash shell中的关键词,相对于[]有以下特点和优势:
[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
实际上,原理就是,在双中括号中,可以使用=~进行shell的正则匹配,找出右边的字符串是否在左边的字符串中。
但是需要注意的是,双中括号在bash中可以使用,在sh中会报找不到的错,这也是我使用的时候遇到的一个坑。
=~ : 包含的意思
网友评论