You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash文本游戏开发:捕获用户输入并提取括号内容的问题

Bash文本游戏:输入处理与括号内容提取方案

嘿,我明白你现在卡在Bash文本游戏的输入处理和括号内容提取上了——别担心,咱们一步步来解决这个问题。你当前的代码没法区分不同输入、提取括号内容,核心原因是没有把选项和对应的括号内容做关联存储,也缺少针对性的输入合法性校验逻辑。

下面是具体的解决方案,直接可以复用和扩展:

1. 先把选项数据结构化管理

与其零散打印选项,不如用数组把所有选项统一存起来,这样后续处理(打印、匹配、提取)都会更方便,也利于游戏后续扩展新选项:

# 定义游戏选项:每个元素对应一条可选操作,格式保持你原来的样式
options=(
    "1 - forward (door.1)"
    "2 - turn left (garden.path)"
    "3 - check surroundings (look.around)"
)

2. 严格的输入合法性验证

我们需要确保用户输入的是1到选项总数之间的整数,拒绝字母、负数、超出范围的数字。可以用正则+数值判断实现:

# 获取选项总数
total_options=${#options[@]}

# 循环直到用户输入合法
while true; do
    read -p "Enter your choice (1-$total_options): " user_input
    # 验证逻辑:必须是纯数字,且在1到total_options之间
    if [[ "$user_input" =~ ^[0-9]+$ ]] && [ "$user_input" -ge 1 ] && [ "$user_input" -le "$total_options" ]; then
        break
    else
        echo "Invalid input! Please enter a number between 1 and $total_options."
    fi
done

3. 提取括号内的目标字符串

对于选中的选项,我们可以用sed的正则捕获组来提取括号里的内容,这个方法简单直接:

# 根据用户输入(注意数组索引从0开始,所以要减1)获取选中的选项
selected_option=${options[$((user_input - 1))]}
# 用sed匹配并提取括号内的内容:.*(\(.*\)).* 表示匹配任意内容+括号,\(.*\)是捕获组,\1输出捕获的内容
target_string=$(echo "$selected_option" | sed -n 's/.*(\(.*\)).*/\1/p')

完整可运行代码示例

把上面的逻辑整合起来,就是一个可以直接测试的完整脚本:

#!/bin/bash

echo -e "You are in front of the gardenhouse.\n"

# 定义游戏选项
options=(
    "1 - forward (door.1)"
    "2 - turn left (garden.path)"
    "3 - check surroundings (look.around)"
)

# 打印所有选项
for option in "${options[@]}"; do
    echo -e "$option"
done
echo -e "\n"

total_options=${#options[@]}

# 输入验证循环
while true; do
    read -p "Enter your choice (1-$total_options): " user_input
    if [[ "$user_input" =~ ^[0-9]+$ ]] && [ "$user_input" -ge 1 ] && [ "$user_input" -le "$total_options" ]; then
        break
    else
        echo "Invalid input! Please enter a number between 1 and $total_options."
    fi
done

# 提取括号内的字符串
selected_option=${options[$((user_input - 1))]}
result=$(echo "$selected_option" | sed -n 's/.*(\(.*\)).*/\1/p')

# 输出结果
echo -e "\nYou chose: $selected_option"
echo "Extracted string: $result"

这个脚本的优势在于:

  • 选项用数组管理,后续加新选项只需要在数组里加一行就行
  • 输入验证覆盖了所有常见的无效情况
  • 括号内容提取逻辑通用,只要你的选项格式保持(内容)的样式就可以用

内容的提问来源于stack exchange,提问作者Peter Core

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:47:36