我正在教授Linux入门课程,并放弃了基于纸张的多项选择测验,并在Bash中创建了互动测验。我的测验脚本功能齐全,但有点快速和肮脏,现在我处于改进阶段并寻找建议。
首先,我不希望自动化评分,这无疑会简化事情。
目前,我为每个测验都有一个不同的脚本文件,问题是硬编码的。这显然很糟糕,所以我创建了一个包含问题的.txt文件,用“问题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所需的简单输入/输出或更好的东西不会花费太多精力。也许这是我的下一步。
答案 0 :(得分:0)
1)你可以使用
sed -n "/^quest.*$i\$/,/^quest.*$(($i+1))\$/ { //!p }"
这里//
重复最后一次尝试的模式,即范围第一行中的开始模式和其余模式的结束模式。
...顺便说一下,如果你真的想用sed做这件事,你最好该死的确保i
是一个数字,否则你会遇到代码注入问题。
2)您可以将多行命令输出存储在变量中而不会出现问题。你只需要确保引用变量everafter以避免shell扩展。例如,
QUESTION=$(sed -n "/^quest.*$i\$/,/^quest.*$(($i+1))\$/ { //!p }" questions.txt)
echo -n "$QUESTION" # <-- the double quotes are important here.
-n
的{{1}}选项告诉echo不要在最后添加换行符,这应该会处理你的提示问题。
3)是的,好吧,hackery会产生更多的hackery。如果你想把它锁定,那么第一项业务就是不给学生一台测试机上的shell。你可以把你的脚本放在inetd后面让学生用telnet或其他东西填写它,我想,但是......真的,为什么要用bash?如果是我,我会用网络服务器和几个巨大的php网络测验框架中的一个来敲门。虽然如果学生能够看到他们提出的问题和答案,我也不得不想知道为什么这是一个问题。它并不像所有学生都使用相同的帐户,可以看到对方的答案,是吗? (是吗?)不要将答案密钥存储在同一台机器上,你不应该有问题。