趣味脚本:美国州首府问答游戏及更多实用脚本解析
美国州首府问答游戏脚本
在拥有了从文件中随机选择一行文本的工具后,就可以编写各种各样的问答游戏脚本。这里介绍的美国州首府问答游戏脚本,能随机选择一个美国州,展示州名并让用户输入对应的首府名称。
代码实现
#!/bin/sh
# states - A state capital guessing game. Requires the state capitals
# data file at http://www.intuitive.com/wicked/examples/state.capitals.txt.
db="/usr/lib/games/state.capitals.txt"
randomquote="$HOME/bin/randomquote.sh" # Script #76
if [ ! -r $db ] ; then
echo "$0: Can't open $db for reading." >&2
echo "(get http://www.intuitive.com/wicked/examples/state.capitals.txt" >&2
echo "save the file as $db and you're ready to play!)" >&2
exit 1
fi
guesses=0; correct=0; total=0
while [ "$guess" != "quit" ] ; do
thiskey="$($randomquote$db)"
state="$(echo $thiskey | cut -d\ -f1 | sed 's/-/ /g')"
city="$(echo $thiskey | cut -d\ -f2 | sed 's/-/ /g')"
match="$(echo $city | tr '[:upper:]' '[:lower:]')"
guess="??" ; total=$(( $total + 1 )) ;
echo ""
echo "What city is the capital of $state?"
while [ "$guess" != "$match" -a "$guess" != "next" -a "$guess" != "quit" ]
do
echo -n "Answer: "
read guess
if [ "$guess" = "$match" -o "$guess" = "$city" ] ; then
echo ""
echo "*** Absolutely correct! Well done! ***"
correct=$(( $correct + 1 ))
guess=$match
elif [ "$guess" = "next" -o "$guess" = "quit" ] ; then
echo ""
echo "$city is the capital of $state."
else
echo "I'm afraid that's not correct."
fi
done
done
echo "You got $correct out of $total presented."
exit 0
代码说明
-
数据文件
:脚本需要一个包含美国州首府数据的文件,可从
http://www.intuitive.com/wicked/examples/state.capitals.txt获取。 -
随机选择
:使用
randomquote.sh脚本从数据文件中随机选择一行。 -
提取信息
:通过
cut和sed命令从选中的行中提取州名和首府名。 - 答案判断 :将用户输入与首府名的全小写版本和实际正确大小写版本进行比较,判断答案是否正确。
-
结束条件
:用户输入
quit时游戏结束,显示最终的正确答题数和总题数。
运行脚本
该脚本没有参数或命令标志,直接运行
states
即可开始游戏。
示例结果
$ states
What city is the capital of Indiana?
Answer: Bloomington
I'm afraid that's not correct.
Answer: Indianapolis
*** Absolutely correct! Well done! ***
What city is the capital of Massachusetts?
Answer: Boston
*** Absolutely correct! Well done! ***
What city is the capital of West Virginia?
Answer: Charleston
*** Absolutely correct! Well done! ***
What city is the capital of Alaska?
Answer: Fairbanks
I'm afraid that's not correct.
Answer: Anchorage
I'm afraid that's not correct.
Answer: Nome
I'm afraid that's not correct.
Answer: Juneau
*** Absolutely correct! Well done! ***
What city is the capital of Oregon?
Answer: quit
Salem is the capital of Oregon.
You got 4 out of 5 presented.
脚本改进思路
- 模糊匹配 :当前游戏对拼写要求严格,可以添加代码实现模糊匹配,例如使用修改后的 Soundex 算法,去除所有元音并将重复字母压缩为单个字母。
- 提示功能 :添加“提示”功能,当用户请求时显示正确答案的第一个字母,并记录使用提示的次数。
- 通用性扩展 :该脚本可以很容易地修改为适用于任何配对数据文件,如意大利语词汇问答、国家/货币匹配或政治家/政党问答。
其他实用脚本介绍
除了州首府问答游戏脚本,还有许多其他实用的脚本,以下是部分脚本的简要介绍:
系统管理类
-
用户管理
-
添加用户
:
adduser脚本用于向系统添加用户,addmacuser用于在 Mac OS X 系统添加用户。 -
删除用户
:
deleteuser脚本可删除用户账户。 -
暂停用户账户
:
suspenduser脚本可暂停用户账户。
-
添加用户
:
-
系统维护
-
备份目录
:
backup脚本用于备份目录,archivedir可将文件归档。 -
日志管理
:
rotatelogs脚本用于旋转日志文件,确保日志文件不会无限增长。 -
系统日期设置
:
set-date脚本可设置系统日期。
-
备份目录
:
网络管理类
-
网站监控
-
Apache 日志分析
:
checklinks脚本可检查内部链接,checkexternal可检查外部链接。 -
网络状态监控
:
netperf脚本用于监控网络状态,getstats可获取网络统计信息。
-
Apache 日志分析
:
-
文件传输
-
FTP 下载
:
ftpget脚本可通过 FTP 下载文件。 -
文件同步
:
ftpsyncup和ftpsyncdown脚本可实现目录的同步。
-
FTP 下载
:
工具类
-
计算器
-
任意精度浮点计算器
:
scriptbc脚本可进行任意精度的浮点计算。 -
交互式计算器
:
calc脚本提供交互式的计算功能。
-
任意精度浮点计算器
:
-
拼写检查
-
单词拼写检查
:
checkspelling脚本可检查单个单词的拼写。 -
添加本地字典
:
spelldict脚本可添加本地字典。
-
单词拼写检查
:
部分脚本操作步骤
运行州首府问答游戏脚本
-
确保已经从
http://www.intuitive.com/wicked/examples/state.capitals.txt下载数据文件,并保存为/usr/lib/games/state.capitals.txt。 -
确保
randomquote.sh脚本存在于$HOME/bin目录下。 -
运行
states脚本开始游戏。
添加用户
-
运行
adduser脚本,按照提示输入用户信息,如用户名、密码等。 -
在 Mac OS X 系统中,运行
addmacuser脚本,同样按照提示完成用户添加操作。
备份目录
-
运行
backup脚本,指定要备份的目录和备份目标位置。 - 脚本会自动完成目录备份操作。
通过这些脚本,可以提高系统管理效率,实现各种实用功能,同时也能在学习和使用过程中加深对 shell 脚本编程的理解。
趣味脚本:美国州首府问答游戏及更多实用脚本解析
脚本使用的关键技术和命令详解
在众多脚本中,使用了许多关键的技术和命令,下面为大家详细解析:
cut
命令
cut
命令用于从文本行中提取指定的字段。在州首府问答游戏脚本中,使用
cut -d\ -f1
和
cut -d\ -f2
分别提取州名和首府名。其中,
-d
选项指定字段分隔符,这里使用空格作为分隔符;
-f
选项指定要提取的字段编号。
例如,对于数据行
California-Sacramento
,执行
echo "California-Sacramento" | cut -d\ -f1
会输出
California
,执行
echo "California-Sacramento" | cut -d\ -f2
会输出
Sacramento
。
sed
命令
sed
是一个强大的文本处理工具,常用于替换、删除和插入文本。在脚本中,
sed 's/-/ /g'
用于将连字符
-
替换为空格。
例如,对于字符串
New-York
,执行
echo "New-York" | sed 's/-/ /g'
会输出
New York
。
tr
命令
tr
命令用于转换或删除字符。在州首府问答游戏脚本中,
tr '[:upper:]' '[:lower:]'
用于将字符串中的所有大写字母转换为小写字母。
例如,对于字符串
Sacramento
,执行
echo "Sacramento" | tr '[:upper:]' '[:lower:]'
会输出
sacramento
。
if
语句
if
语句用于根据条件执行不同的操作。在脚本中,经常使用
if
语句来判断文件是否可读、用户输入是否正确等。
例如,在州首府问答游戏脚本中,
if [ ! -r $db ]
用于判断数据文件是否可读,如果不可读则输出错误信息并退出脚本。
while
循环
while
循环用于重复执行一段代码,直到条件不满足为止。在州首府问答游戏脚本中,使用
while
循环来不断询问用户问题,直到用户输入
quit
为止。
脚本的调试和测试
在编写和使用脚本的过程中,调试和测试是非常重要的环节。以下是一些调试和测试脚本的方法:
调试脚本
-
使用
set -x:在脚本开头添加set -x可以开启调试模式,脚本执行时会输出每一条命令及其参数,方便查看脚本的执行过程。 -
使用
echo语句 :在关键位置添加echo语句,输出变量的值,以便检查变量是否符合预期。
例如,在州首府问答游戏脚本中,可以在
thiskey="$($randomquote$db)"
之后添加
echo "thiskey: $thiskey"
来查看随机选择的行内容。
测试脚本
- 单元测试 :对于一些功能独立的函数或脚本,可以编写单元测试来验证其功能是否正确。
- 集成测试 :将多个脚本组合在一起进行测试,确保它们能够协同工作。
脚本的优化建议
为了提高脚本的性能和可读性,可以对脚本进行一些优化:
性能优化
- 减少不必要的命令执行 :避免在循环中执行一些耗时的命令,如文件查找等。
- 使用缓存 :对于一些经常使用的数据,可以将其缓存起来,避免重复计算。
可读性优化
- 添加注释 :在脚本中添加详细的注释,解释代码的功能和逻辑。
- 使用有意义的变量名 :使用有意义的变量名可以提高代码的可读性。
总结与展望
通过对这些脚本的学习和使用,我们可以看到 shell 脚本在系统管理、网络管理和工具开发等方面具有强大的功能。这些脚本不仅可以提高工作效率,还可以帮助我们更好地理解和掌握 Unix 和 Linux 系统。
未来,随着技术的不断发展,shell 脚本也将不断创新和完善。我们可以期待更多功能强大、易用的脚本出现,同时也可以根据自己的需求开发出更加个性化的脚本。
以下是一个简单的 mermaid 流程图,展示州首府问答游戏的流程:
graph TD;
A[开始游戏] --> B[随机选择一个州];
B --> C[显示州名并询问首府];
C --> D{用户输入是否正确};
D -- 是 --> E[显示正确提示,正确数加 1];
E --> F{是否继续};
F -- 是 --> B;
F -- 否 --> G[显示最终结果,结束游戏];
D -- 否 --> H{用户输入是否为 next 或 quit};
H -- 是 --> I[显示正确答案];
I --> F;
H -- 否 --> C;
以下是一个表格,总结部分脚本的功能和用途:
| 脚本名称 | 功能 | 用途 |
| ---- | ---- | ---- |
|
states
| 美国州首府问答游戏 | 学习州首府知识,娱乐 |
|
adduser
| 添加用户 | 系统用户管理 |
|
deleteuser
| 删除用户 | 系统用户管理 |
|
backup
| 备份目录 | 系统数据备份 |
|
rotatelogs
| 旋转日志文件 | 系统日志管理 |
希望通过本文的介绍,大家能够对这些脚本有更深入的了解,并在实际工作中灵活运用。
超级会员免费看
73

被折叠的 条评论
为什么被折叠?



