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

开发Shell版客户披萨点餐系统遇实现问题求可行思路

Shell点餐系统实现方案

现有代码核心问题

  • 数组类型误用:declare -A是声明关联数组(需指定[key]=value键值对格式),你存储的是纯列表类菜单选项,应该用索引数组声明declare -a
  • 语法错误:多个数组未闭合括号、变量名不统一(用户输入存到$selection但判断用的是未定义的$decision)、重复冗余的判断逻辑、字符串未闭合
  • 作用域问题:函数内声明的数组默认是局部变量,外部无法访问,需要加-g参数声明为全局数组
  • Shell原生不支持直接嵌套数组,但可以通过命名规则+间接引用的方式模拟嵌套效果,完全可以满足点餐系统的需求

可行实现思路

  1. 数组规划:所有菜单数组用索引数组声明,需要全局访问的加-g参数
  2. 模拟嵌套:同类子选项统一命名前缀,比如披萨相关的子选项统一用pizza_xxx命名,之后通过变量名拼接的方式动态读取,替代Python的嵌套列表效果
  3. 流程简化:按「欢迎页→是否看特价→主菜单选择→子项选择(选披萨后再选尺寸、饼底、配料)→结算」的线性流程开发,去掉重复冗余的判断逻辑
  4. 通用工具函数:封装数组打印、用户选择读取等通用逻辑,减少重复代码

可运行的修正示例代码

#!/bin/bash

# 全局菜单数据定义
init_menu() {
  # 主菜单
  declare -ag main_menu=(
    "查看全部" "披萨" "面包" "小食" "甜点" 
    "意面" "三明治" "沙拉" "饮品" "其他"
  )
  # 披萨相关选项
  declare -ag pizza_size=("小份" "中份" "大份" "超大份")
  declare -ag pizza_crust=("布鲁克林款" "手揉" "深盘" "薄底")
  declare -ag pizza_cheese=("马苏里拉芝士")
  declare -ag pizza_sauce=("番茄酱" "蜂蜜BBQ酱" "蒜香帕尔马干酪酱" "阿尔弗雷多酱" "牧场酱")
  declare -ag pizza_meat_topping=("火腿" "牛肉" "萨拉米" "意式香肠" "鸡肉" "培根" "牛肉片")
  declare -ag pizza_non_meat_topping=("buffalo辣酱" "墨西哥辣椒" "洋葱" "香蕉辣椒" "番茄丁" "黑橄榄" "蘑菇" "菠萝" "切达芝士" "普罗卧干酪" "青椒" "菠菜" "烤番茄" "菲达芝士" "帕尔马干酪碎")
  declare -ag special_pizza=("鸡肉塔可披萨" "汉堡披萨" "太平洋蔬菜披萨" "夏威夷披萨" "至尊pepperoni披萨" "孟菲斯BBQ鸡肉披萨" "超级至尊披萨" "全肉披萨" "费城芝士牛排披萨" "加州鸡肉培根牧场披萨" "布法罗鸡肉披萨")
  # 其他品类选项
  declare -ag wings=("布法罗辣鸡翅" "蜂蜜BBQ鸡翅" "原味鸡翅" "哈瓦那辣鸡翅" "蒜香帕尔马干酪鸡翅")
  declare -ag sandwiches=("布法罗鸡肉三明治" "哈瓦那鸡肉三明治" "地中海蔬菜三明治" "费城芝士牛排三明治" "鸡肉培根牧场三明治" "意式三明治" "帕尔马鸡肉三明治")
  declare -ag salads=("经典田园沙拉" "鸡肉沙拉")
  declare -ag drinks=("可乐" "雪碧" "芬达" "橙汁" "柠檬水" "茶" "根汁汽水")
  declare -ag desserts=("布朗尼" "巧克力奇普饼干" "肉桂扭结包")
}

# 通用打印数组函数,传入数组名即可自动打印带序号的选项
print_options() {
  local arr_name="$1"
  eval "local items=(\"\${$arr_name[@]}\")"
  for idx in "${!items[@]}"; do
    echo "$((idx+1)). ${items[$idx]}"
  done
}

# 主流程
main() {
  clear
  init_menu
  echo "欢迎来到Soprano's 披萨店"
  echo "请问需要点什么?"
  read -p "要不要先看看我们的特价披萨?[y/n] " sel_special

  if [[ "$sel_special" =~ ^[Yy]$ ]]; then
    echo "=== 特价披萨列表 ==="
    print_options special_pizza
    read -p "请选择你要的特价披萨编号: " sel_sp
    eval "echo 你选择了:\${special_pizza[$((sel_sp-1))]}"
  else
    echo "=== 主菜单 ==="
    print_options main_menu
    read -p "请选择品类编号: " sel_main
    eval "local cat=\${main_menu[$((sel_main-1))]}"
    echo "你选择了品类:$cat"
    # 后续可以根据选中的品类,调用对应的子选项列表,比如选了披萨就打印尺寸、饼底等选项
  fi
}

# 启动程序
main

扩展说明

如果需要实现多选配料、累计价格、优惠券核销等功能,可以新增全局数组存储用户已选商品、新增变量存储总金额,每次用户选择后更新对应数据即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:18:03