美文网首页
shell-实战3

shell-实战3

作者: JSFnull | 来源:发表于2020-04-30 11:33 被阅读0次

    企业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中会报找不到的错,这也是我使用的时候遇到的一个坑。
    =~ : 包含的意思

    相关文章

      网友评论

          本文标题:shell-实战3

          本文链接:https://www.haomeiwen.com/subject/cdhzwhtx.html