28、趣味脚本:美国州首府问答游戏及更多实用脚本解析

趣味脚本:美国州首府问答游戏及更多实用脚本解析

美国州首府问答游戏脚本

在拥有了从文件中随机选择一行文本的工具后,就可以编写各种各样的问答游戏脚本。这里介绍的美国州首府问答游戏脚本,能随机选择一个美国州,展示州名并让用户输入对应的首府名称。

代码实现
#!/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 可获取网络统计信息。
  • 文件传输
    • FTP 下载 ftpget 脚本可通过 FTP 下载文件。
    • 文件同步 ftpsyncup ftpsyncdown 脚本可实现目录的同步。
工具类
  • 计算器
    • 任意精度浮点计算器 scriptbc 脚本可进行任意精度的浮点计算。
    • 交互式计算器 calc 脚本提供交互式的计算功能。
  • 拼写检查
    • 单词拼写检查 checkspelling 脚本可检查单个单词的拼写。
    • 添加本地字典 spelldict 脚本可添加本地字典。
部分脚本操作步骤
运行州首府问答游戏脚本
  1. 确保已经从 http://www.intuitive.com/wicked/examples/state.capitals.txt 下载数据文件,并保存为 /usr/lib/games/state.capitals.txt
  2. 确保 randomquote.sh 脚本存在于 $HOME/bin 目录下。
  3. 运行 states 脚本开始游戏。
添加用户
  1. 运行 adduser 脚本,按照提示输入用户信息,如用户名、密码等。
  2. 在 Mac OS X 系统中,运行 addmacuser 脚本,同样按照提示完成用户添加操作。
备份目录
  1. 运行 backup 脚本,指定要备份的目录和备份目标位置。
  2. 脚本会自动完成目录备份操作。

通过这些脚本,可以提高系统管理效率,实现各种实用功能,同时也能在学习和使用过程中加深对 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 | 旋转日志文件 | 系统日志管理 |

希望通过本文的介绍,大家能够对这些脚本有更深入的了解,并在实际工作中灵活运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值