Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
疯人忠
Linux Shell Exam System
提交
9e856fc2
L
Linux Shell Exam System
项目概览
疯人忠
/
Linux Shell Exam System
9 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
Linux Shell Exam System
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
9e856fc2
编写于
12月 26, 2021
作者:
Z
Zhong-master
提交者:
GitHub
12月 26, 2021
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add files via upload
上级
51654802
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
283 addition
and
0 deletion
+283
-0
sh
sh
+283
-0
未找到文件。
sh
0 → 100644
浏览文件 @
9e856fc2
#!/bin/bash
while
:
# while循环
do
echo
`
clear
`
# 清屏
# 打印开始界面
echo
-e
'
************************Exam Review System************************\n\n
Exam---------------------------------------1 \n
Review-------------------------------------2 \n
Record-------------------------------------3 \n
Exit---------------------------------------4 \n\n
**********************please input [1/2/3/4]**********************\n'
read
-p
'Input Your Choice: '
choice
# 等待用户输入
# 如果用户输入了1/2/3之一,则进入分支,否则将重复显示开始界面
if
[[
$choice
=
1||
$choice
=
2||
$choice
=
3
]]
;
then
case
${
choice
}
in
# switch case分支判断
1
)
echo
'Exam Start, Good Luck!'
# 用户输入了1
score
=
0
# 分数
flag
=
0
# 题型标志位
count
=
0
# 字符数标志位
if_break
=
0
# 用户主动退出标志位
first_line
=
0
# 题目第一行标志位
questions_count
=
1
# 题目数量
question
=()
# 数组变量 --> 将用来存储每一道题目
list
=()
# 数组变量 --> 将用来存储文件行
wrong_question
=()
# 数组变量 --> 将用来存储错题
for
line
in
`
cat
Question_bank.txt
`
# 循环读取文件的每一行
do
list+
=(
${
line
}
)
# 将每一行作为一个元素加入到list数组中
done
echo
`
clear
`
# 清屏
# 打印提示和用户得分
echo
-e
"
please input your answer or input -1 to exit
\n
A total of 40 questions. Your Score is:
$score
\n
"
start
=
$(
date
+%s
)
for
line
in
${
list
[@]
}
# 循环读取list数组,取得每一行
do
rand
=
${
RANDOM
%50
}
# 生成随机数 [0, 50]
count
=
$((
${#
line
}
-
1
))
# 计算每一行的字符数
a
=
`
expr
index
$line
'答案'
`
# 检查当前行是否存在“答案”两个字
# 判断a是否有数值:是否在当前行中找到了“答案两个字”
if
[[
$a
>
0
]]
then
wrong_question+
=(
${
line
}
)
# 将答案加入错题变量
result
=
${
line
:3:4
}
# 获取“答案:A”的“A”字符
result
=
${
result
:0:1
}
# 除去“A”字符后的“\n\r”换行字符
continue
# 跳过这一行,不让答案显示
fi
question+
=(
${
line
}
)
# 显示当前行,如果上面没有continue,此处会将“答案:A”显示出来
wrong_question+
=(
${
line
}
)
# 将题目先加入错题变量
let
flag+
=
1
# 只要成功显示当前行,则+1
# 如果当前行字符数为零:当前行是空行,题目之间以空行隔开,所以可以这样判断
if
[[
$count
-lt
1
]]
;
then
if
[[
$((
$rand
%
13
))
==
0
]]
# 如果随机数能被13除尽
then
if
[[
$questions_count
-lt
21
]]
# 只从题库中抽取40题
then
for
one
in
${
question
[@]
}
do
# 判断当前行是否为第一行,第一行都是题目,剩下的都是选项,如果是的话则执行字符串切片与拼接
if
[[
$first_line
==
0
]]
then
index
=
`
awk
-v
a
=
"
$one
"
-v
b
=
"、"
'BEGIN{print index(a,b)}'
`
echo
"
$questions_count
、
${
one
:
$((
index
))}
"
let
first_line+
=
1
continue
fi
echo
$one
done
let
questions_count+
=
1
let
first_line
=
0
# 如果输出的行数小于4:判断对错的题目只有一行,需要填写A/B/C/D的题目有4行
if
[
$flag
-lt
4
]
then
read
-p
'Input Your Answer[T/F/-1]: '
answer
# 定制:判断对错的题目输入提示
else
:
read
-p
'Input Your Answer[A/B/C/D/-1]: '
answer
# 定制:填写A/B/C/D的题目输入提示
fi
# 如果的形式为“答案:对”,则用“T”替换掉中文的“对”,方便用户输入,相对的用“F”替换掉“错”
if
[
$result
==
'对'
]
then
result
=
'T'
elif
[
$result
==
'错'
]
then
result
=
'F'
fi
# 判断用户输入是否与答案一致
if
[
$result
==
${
answer
^^
}
]
;
then
let
score+
=
1
# 如果一致,分数+1
echo
-e
"
\n
!!!You're Right!!! >A<"
wrong_question
=()
# 错题变量重置
sleep
2
# 程序休眠3秒,让用户看到“答题正确”的提示
elif
[
$answer
==
-1
]
# 如果用户输入的是“-1”,则退出当前考试分支
then
let
if_break+
=
1
break
elif
[
$score
!=
0
]
# 如果答错了,且用户的分数不为0,则分数-1
then
let
score-
=
1
echo
-e
"
\n
...You're Wrong... T-T"
for
line
in
${
wrong_question
[@]
}
do
echo
-e
$line
>>
wrong_file.txt
# 将错题加入错题文件wrong_file.txt
wrong_question
=()
# 错题变量重置
done
echo
-e
"
\n
答案:
$result
"
# 打印正确答案
sleep
2
# 程序休眠3秒,让用户看到“答题错误”的提示
elif
[
$result
!=
$choice
]
;
# 如果答错了,且用户的分数为0
then
echo
-e
"
\n
...You're Wrong... T-T"
for
line
in
${
wrong_question
[@]
}
do
echo
-e
$line
>>
wrong_file.txt
# 将错题加入错题文件wrong_file.txt
wrong_question
=()
# 错题变量重置
done
echo
-e
"
\n
答案:
$result
"
# 打印正确答案
sleep
2
# 程序休眠3秒,让用户看到“答题错误”的提示
fi
echo
`
clear
`
# 清屏
# 重新显示用户分数,每次都会刷新,否则用户的分数不会变更
echo
-e
"
please input your answer or input -1 to exit
\n
A total of 40 questions. Your Score is:
$score
\n
"
flag
=
0
# 题型标志位重置为0
else
:
break
fi
fi
wrong_question
=()
question
=()
let
flag
=
0
fi
done
if
[
$if_break
==
0
]
then
echo
`
clear
`
end
=
$(
date
+%s
)
#time=$(echo "scale=2;$(( $end - $start ))/60"|bc)
time
=
`
echo
"scale=4;r=
$((
$end
-
$start
))
/60;if(length(r) == scale(r)) print 0;print r"
|bc
`
echo
"
You have finished all the questions. Congratulations!!!
Used Time:
$time
min. Your Score:
$score
"
echo
"Used Time:
$time
min. Your Score:
$score
."
>>
Exam_record.txt
else
:
fi
read
-p
'Press any key to continue...'
y
echo
`
clear
`
;;
2
)
echo
'Review Start, Good Luck!'
# 用户输入了2
first
=
0
# 因为文件的第一行经常会出现空行,这里只用于判断第一行空行
score
=
0
# 分数
flag
=
0
# 题型标志位
count
=
0
# 字符数标志位
if_break
=
0
# 用户主动退出标志位
list
=()
# 数组变量 --> 将用来存储文件行
right_question
=()
# 数组变量 --> 将用来存储错题
for
line
in
`
cat
wrong_file.txt
`
# 循环读取文件的每一行
do
list+
=(
${
line
}
)
# 将每一行作为一个元素加入到list数组中
done
echo
`
clear
`
# 清屏
# 打印提示和用户得分
echo
-e
"
please input your answer or input -1 to exit
\n
Your Score is:
$score
\n
"
for
question
in
${
list
[@]
}
# 循环读取list数组,取得每一行
do
count
=
$((
${#
question
}
-
1
))
# 计算每一行的字符数
a
=
`
expr
index
$question
'答案'
`
# 检查当前行是否存在“答案”两个字
# 判断a是否有数值:是否在当前行中找到了“答案两个字”
if
[[
$a
>
0
]]
then
right_question+
=(
${
question
}
)
# 将答案加入错题变量
result
=
${
question
:3:4
}
# 获取“答案:A”的“A”字符
result
=
${
result
:0:1
}
# 除去“A”字符后的“\n\r”换行字符
continue
# 跳过这一行,不让答案显示
fi
echo
$question
# 显示当前行,如果上面没有continue,此处会将“答案:A”显示出来
right_question+
=(
${
question
}
)
# 将题目先加入错题变量
let
flag+
=
1
# 只要成功显示当前行,则+1
# 如果当前行字符数为零:当前行是空行,题目之间以空行隔开,所以可以这样判断
if
[[
$count
-lt
1
]]
&&
[[
$first
-gt
0
]]
then
# 如果输出的行数小于4:判断对错的题目只有一行,需要填写A/B/C/D的题目有4行
if
[
$flag
-lt
4
]
then
read
-p
'Input Your Answer[T/F/-1]: '
answer
# 定制:判断对错的题目输入提示
else
:
read
-p
'Input Your Answer[A/B/C/D/-1]: '
answer
# 定制:填写A/B/C/D的题目输入提示
fi
# 如果的形式为“答案:对”,则用“T”替换掉中文的“对”,方便用户输入,相对的用“F”替换掉“错”
if
[
$result
==
'对'
]
then
result
=
'T'
elif
[
$result
==
'错'
]
then
result
=
'F'
fi
# 判断用户输入是否与答案一致
if
[
$result
==
${
answer
^^
}
]
;
then
let
score+
=
1
# 如果一致,分数+1
echo
-e
"
\n
!!!You're Right!!! >A<"
for
line
in
${
right_question
[@]
}
do
count_line
=
$((
${#
line
}
-
1
))
# 计算当前行的字符数
result_line
=
${
line
:0:
$count_line
}
# 字符串分割
if
[[
${#
result_line
}
-gt
0
]]
# 如果当前行不为空行的话,则执行删除
then
sed
-i
"0,/
$result_line
/d"
wrong_file.txt
||
echo
'Finish'
fi
right_question
=()
# 错题变量重置
done
sleep
2
# 程序休眠3秒,让用户看到“答题正确”的提示
elif
[
$answer
==
-1
]
# 如果用户输入的是“-1”,则退出当前考试分支
then
let
if_break+
=
1
break
elif
[
$score
!=
0
]
# 如果答错了,且用户的分数不为0,则分数-1
then
let
score-
=
1
echo
-e
"
\n
...You're Wrong... T-T"
right_question
=()
# 错题变量重置
echo
-e
"
\n
答案:
$result
"
# 打印正确答案
sleep
2
# 程序休眠3秒,让用户看到“答题错误”的提示
elif
[
$result
!=
$choice
]
;
# 如果答错了,且用户的分数为0
then
echo
-e
"
\n
...You're Wrong... T-T"
right_question
=()
# 错题变量重置
echo
-e
"
\n
答案:
$result
"
# 打印正确答案
sleep
2
# 程序休眠3秒,让用户看到“答题错误”的提示
fi
echo
`
clear
`
# 清屏
# 重新显示用户分数,每次都会刷新,否则用户的分数不会变更
echo
-e
"
please input your answer or input -1 to exit
\n
Your Score is:
$score
\n
"
flag
=
0
# 题型标志位重置为0
fi
let
first+
=
1
done
if
[
$if_break
==
0
]
then
echo
"
You have finished all the questions. Congratulations!!!"
else
:
fi
read
-p
'Press any key to continue...'
y
echo
`
clear
`
;;
3
)
echo
'Record Success, Keep it up!'
# 用户输入了3
count
=
1
echo
`
clear
`
cat
Exam_record.txt |
while
read
line
do
echo
"
$count
、
$line
"
echo
let
count+
=
1
done
read
-p
'Press any key to continue...'
y
echo
`
clear
`
;;
4
)
echo
'Exit Success, Have a Good Day!'
# 用户输入了3
sleep
3
# 程序休眠3秒
echo
`
clear
`
# 清屏
break
;;
esac
fi
done
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录