Bash 中的交互式测验(多个问题)
Interactive quiz in Bash (Multiple Q's)
我正在教授一门介绍性 Linux 课程,并放弃了基于纸质的多项选择测验,并在 Bash 中创建了交互式测验。我的测验脚本很实用,但有点快速和肮脏,现在我正处于改进阶段并寻求建议。
首先,我不希望自动进行评分,这肯定会简化事情。
目前,我对每个测验都有不同的脚本文件,而且问题是硬编码的。这显然很糟糕,所以我创建了一个包含问题的 .txt 文件,用 "question 01" 等行分隔。我可以遍历并使用 sed -n "/^quest.*$i$/,/^quest.*$(($i+1))$/p"
,但这会打印分隔符行。我可以通过 sed "/^q/d"
或 head -n-1|tail -n+2
来摆脱它们,但是有更好的方法吗?
第二期:对于答案是实际命令的问题,我打印 [user]$
提示,但对于简答,我使用 >
。在我的文本文件中,对于每个问题,最后一行是使用提示。最初,我想我可以将问题存储在一个变量中并 |tail -1
它以获得提示,但是,当你存储它时它会去除换行符。我希望光标立即跟随提示,所以我需要将它传递给 read -p
或从输出中删除最后的换行符。 (或者在文件中创建一些标记来区分 $
和 >
提示。)我曾想过将每个问题存储在一个单独的文件中,然后 cat
来显示它,确保末尾没有换行符。维护起来可能有点痛苦,但它可以解决这两个问题。想法?
现在来谈谈我实际上 运行 的测验。这是一个 Fedora 20 盒子,我尝试复制 bash
并将其设置为我,以便它能够阅读学生通常无法阅读的测验脚本,但我无法理解去工作。经过反复试验,我最终复制了 touch
并将其设置为我,然后使用它在带有 ACL 的 "submit" 目录中创建他们的答案文件,因此新文件具有 o=w 所以他们可以写入他们的答案文件(在 >> echo
的测验中)但不能读回或访问目录。我看到的唯一主要漏洞是他们可以按名称删除他们的文件并重新开始测验,而没有这样做的记录。因为我没有做任何自动评分,所以我不太关心学生能否阅读脚本文件,尽管如果我单独存储问题,我想我可以复制 cat
并设置它以读取他们无法访问的文件。
此外,我意识到 Bash 不是最好的选择,学习 Python 所需的简单 input/output 或更好的东西不会花费太多精力。也许这就是我的下一步。
1) 你可以使用
sed -n "/^quest.*$i$/,/^quest.*$(($i+1))$/ { //!p }"
此处 //
重复上次尝试的形态,即范围第一行的开盘形态和其余的收盘形态。
...顺便说一下,如果你真的想用 sed 做这个,你最好 该死的 确保 i
是一个数字,或者你' ll 运行 进入代码注入问题。
2) 您可以毫无问题地将多行命令输出存储在变量中。您只需要确保从此引用该变量以避免对其进行 shell 扩展。例如,
QUESTION=$(sed -n "/^quest.*$i$/,/^quest.*$(($i+1))$/ { //!p }" questions.txt)
echo -n "$QUESTION" # <-- the double quotes are important here.
echo
的 -n
选项告诉 echo 不要在末尾添加换行符,这应该可以解决您的提示问题。
3) 是的,好吧,hackery 孕育了更多的 hackery。如果你想锁定这个,首要任务就是不要给学生一个 shell 在测试机上。您可以将您的脚本放在 inetd 后面,让学生用 telnet 或其他东西填写它,我想,但是......真的,为什么 bash?如果是我,我会把一些东西与网络服务器和数以千计的 php 网络测验框架之一结合起来。尽管我也想知道如果学生可以看到他们给出的问题和答案,为什么会出现问题。不是所有的学生都使用同一个账号就可以看到彼此的答案,对吧? (是吗?)不要将答案密钥存储在同一台机器上,你应该不会有问题。
我正在教授一门介绍性 Linux 课程,并放弃了基于纸质的多项选择测验,并在 Bash 中创建了交互式测验。我的测验脚本很实用,但有点快速和肮脏,现在我正处于改进阶段并寻求建议。
首先,我不希望自动进行评分,这肯定会简化事情。
目前,我对每个测验都有不同的脚本文件,而且问题是硬编码的。这显然很糟糕,所以我创建了一个包含问题的 .txt 文件,用 "question 01" 等行分隔。我可以遍历并使用 sed -n "/^quest.*$i$/,/^quest.*$(($i+1))$/p"
,但这会打印分隔符行。我可以通过 sed "/^q/d"
或 head -n-1|tail -n+2
来摆脱它们,但是有更好的方法吗?
第二期:对于答案是实际命令的问题,我打印 [user]$
提示,但对于简答,我使用 >
。在我的文本文件中,对于每个问题,最后一行是使用提示。最初,我想我可以将问题存储在一个变量中并 |tail -1
它以获得提示,但是,当你存储它时它会去除换行符。我希望光标立即跟随提示,所以我需要将它传递给 read -p
或从输出中删除最后的换行符。 (或者在文件中创建一些标记来区分 $
和 >
提示。)我曾想过将每个问题存储在一个单独的文件中,然后 cat
来显示它,确保末尾没有换行符。维护起来可能有点痛苦,但它可以解决这两个问题。想法?
现在来谈谈我实际上 运行 的测验。这是一个 Fedora 20 盒子,我尝试复制 bash
并将其设置为我,以便它能够阅读学生通常无法阅读的测验脚本,但我无法理解去工作。经过反复试验,我最终复制了 touch
并将其设置为我,然后使用它在带有 ACL 的 "submit" 目录中创建他们的答案文件,因此新文件具有 o=w 所以他们可以写入他们的答案文件(在 >> echo
的测验中)但不能读回或访问目录。我看到的唯一主要漏洞是他们可以按名称删除他们的文件并重新开始测验,而没有这样做的记录。因为我没有做任何自动评分,所以我不太关心学生能否阅读脚本文件,尽管如果我单独存储问题,我想我可以复制 cat
并设置它以读取他们无法访问的文件。
此外,我意识到 Bash 不是最好的选择,学习 Python 所需的简单 input/output 或更好的东西不会花费太多精力。也许这就是我的下一步。
1) 你可以使用
sed -n "/^quest.*$i$/,/^quest.*$(($i+1))$/ { //!p }"
此处 //
重复上次尝试的形态,即范围第一行的开盘形态和其余的收盘形态。
...顺便说一下,如果你真的想用 sed 做这个,你最好 该死的 确保 i
是一个数字,或者你' ll 运行 进入代码注入问题。
2) 您可以毫无问题地将多行命令输出存储在变量中。您只需要确保从此引用该变量以避免对其进行 shell 扩展。例如,
QUESTION=$(sed -n "/^quest.*$i$/,/^quest.*$(($i+1))$/ { //!p }" questions.txt)
echo -n "$QUESTION" # <-- the double quotes are important here.
echo
的 -n
选项告诉 echo 不要在末尾添加换行符,这应该可以解决您的提示问题。
3) 是的,好吧,hackery 孕育了更多的 hackery。如果你想锁定这个,首要任务就是不要给学生一个 shell 在测试机上。您可以将您的脚本放在 inetd 后面,让学生用 telnet 或其他东西填写它,我想,但是......真的,为什么 bash?如果是我,我会把一些东西与网络服务器和数以千计的 php 网络测验框架之一结合起来。尽管我也想知道如果学生可以看到他们给出的问题和答案,为什么会出现问题。不是所有的学生都使用同一个账号就可以看到彼此的答案,对吧? (是吗?)不要将答案密钥存储在同一台机器上,你应该不会有问题。