阿小信大人的头像
做你说过的,说你能做的 阿小信大人

quiz小程序2014-09-02 06:22

在脚本目录下有quiz文件夹,其中有自目录,目录名为题目分类名,子目录中有文本文件,内容为题目详细信息,格式为第一行为题目。第二行为选项个数。后面的为选项。最后一行为正确答案。

hello,____\?
4
hi
ok
world
word
world

脚本:

#!/bin/bash

function initialize()
{
   #初始化变量
   trap 'summarize; exit 0' INT #用户C+c中断程序时显示结果
   num_ques=0   #出现了多少道题
   num_correct=0   #回答正确的题数
   first_time=true  #第一次回答时提示
   cd ./quiz 2>/dev/null #切换到问题分类目录
}


function choose_subj()
{
    subjects=($(ls)) #当前quiz目录下所有文件名称(题目分类)
    PS3="从以下列表中选择一个类别开始挑战: "

    #显示所有目录为分类选项
    select sub in ${subjects[*]}
    do
        if [[ -z "$sub" ]]
        then
            echo "没有选择任何类别,再见!" >&2
            exit 1
        fi
        echo $sub
        return 0
    done
}


function exchange()
{
    t=${questions[$1]}
    questions[$1]=${questions[$2]}
    questions[$2]=$t
}


function scramble()
{
    #保存所有问题的名字,并打乱数组条目
    typeset -i index ques_count
    questions=($(ls))
    ques_count=${#questions[*]}
    ((index=ques_count-1))
    while [[ $index>0 ]]
    do
        ((target=RANDOM%index))
        exchange $target $index
        ((index-=1))
    done
}


function ask()
{
    #读入参数指定的问题文件内容显示问题。接收答案。判断正误。
    exec 3<$1 #指定文件描述符
    read -u3 ques || exit 2 #读取第一行作为问题
    read -u3 num_opts || exit 2 #读取第二行作为选项个数

    index=0
    choices=()
    while (( index<num_opts ))
    do
        read -u3 next_choice || exit 2 #读取所有选项并保存到choices中
        choices=("${choices[@]}" "$next_choice")
        ((index+=1))
    done

    read -u3 correct_answer || exit 2 #读取正确答案
    exec 3<&- #关闭文件描述符

    if [[ $first_time = true ]]
    then
        first_time=false
        echo -e "你可以按C+c退出"
    fi

    PS3=$ques" "
    select answer in "${choices[@]}" #显示所有选项,判断答案
    do
        if [[ -z "$answer" ]]
        then
            echo "无效输入"
        elif [[ "$answer" = "$correct_answer" ]]
        then
            echo "正确"
            return 1
        else
            echo "错误"
            return 0
        fi
    done
}


function summarize()
{
    echo
    if ((num_ques == 0))
    then
        echo "没有答对任何一道"
        exit 0
    fi
    (( percent=num_correct*100/num_ques ))
    echo "答对$num_correct道,共$num_ques道,正确率$percent"
}


initialize

subject=$(choose_subj) #将choose_obj的输出替换为subject的值
[[ $? -eq 0 ]] || exit 2


cd $subject || exit 2
echo
scramble

for ques in ${questions[*]}
do
    echo $ques
    ask $ques
    result=$?
    (( num_ques=num_ques+1 ))
    if [[ $result == 1 ]] #返回1表示回答正确
    then
        (( num_correct += 1 ))
    fi
    echo
    sleep 1
done

summarize
exit 0

运行效果:

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Linux/Mac#   #shell
分享到:
阅读[1169] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

发表评论