【问题标题】:Bash Shell Scripting - Select Case Menu Not WorkingBash Shell 脚本 - 选择案例菜单不起作用
【发布时间】:2015-03-13 09:58:42
【问题描述】:

我对 shell 编程还是很陌生.. 并且正在从事项目

我正在使用 Select Case 进行选择菜单

下面是脚本

 #! /usr/bin/bash

    echo "1) Add new book"
    echo "2) Remove existing book info"
    echo "3) Update book info and quantity"
    echo "4) Search for book by title/author"
    echo "5) Process a book sold"
    echo "6) Inventory summary report"
    echo "7) Quit"

    PS3="Please enter your option: "
    select book in Add Remove update search process inventory quit
    #read book
    do
        case $book in
            1) echo "Add new book"
           echo "Title: "
           read title
           echo $title > BookDB.txt

           echo "Author: "
           read name
           echo $name > BookDB.txt

           echo "$title successfully added!"
           break
           ;;

            2) echo "Remove existing book info"
                sed '$NAME' BookDB.txt
           break
           ;;

            3) echo "Update book info and quantity"
           echo "Title: "
           read title
           echo $title < BookDB.txt

           echo "Author: "
           read name
           echo $name < BookDB.txt
           break
           ;;  

            4) echo "Search for book by title/author"
           break
           ;;

            5) echo "Process a book sold"
           break
           ;;

            6) echo "Inventory summary report"
           break
           ;;

            7) echo "Quit"
           exit   
           ;;
        esac
    done

及以下是Ubuntu terminal中的shell commands

1) Add new book
2) Remove existing book info
3) Update book info and quantity
4) Search for book by title/author
5) Process a book sold
6) Inventory summary report
7) Quit
1) Add        3) update     5) process    7) quit
2) Remove     4) search     6) inventory
Please enter your option: 1
Please enter your option:

echo 中的文字在我输入 1 后不会出现。即使我选择退出,它也不会返回菜单。我如何让它工作? :(

非常感谢任何帮助。谢谢! :)

【问题讨论】:

    标签: bash shell echo select-case


    【解决方案1】:

    替换

    select book in Add Remove update search process inventory quit
    

    与:

    select book in 1 2 3 4 5 6 7 
    

    【讨论】:

      【解决方案2】:

      来自bash 联机帮助页(我的斜体和粗体):

      select name [ in word ] ; do list ; done

      in 后面的单词列表被展开,生成一个项目列表。扩展单词集打印在标准错误上,每个单词前面都有一个数字。如果省略 in 字,则打印位置参数(请参阅下面的 PARAMETERS)。

      然后显示 PS3 提示并从标准输入读取一行。

      如果该行包含与显示的单词之一相对应的数字,则 name 的值设置为该单词。

      如果该行为空,则再次显示单词和提示。如果读取 EOF,则命令完成。

      读取的任何其他值都会导致 name 设置为 null。读取的行保存在变量 REPLY 中。每次选择后都会执行列表,直到执行中断命令。

      select 的退出状态是列表中最后执行的命令的退出状态,如果没有执行任何命令,则为零。

      因此,在您的case 语句中,您需要"Add" 而不是1,其他人同上。


      您还应该了解您在每种情况下实际在做什么。显然后者是空的,因为您还没有使用它们,但是在第二种情况下您使用 sed 不会从文件中删除任何内容。并且,对于第三种情况:

      echo $title < BookDB.txt
      

      在...有趣。如果是 输出 重定向,我可以理解计划的开始,但是您拥有的行将简单地输出 $title 并完全忽略输入重定向的内容。

      毫无疑问,您会及时修复它们,我只是想将它们作为需要查看的东西引起您的注意。

      【讨论】:

        【解决方案3】:

        在select语句下,以防你应该使用select中声明的字符串。在这里你应该这样做:

        select book in Add Remove update search process inventory quit
        do
            case $book in
                Add) echo "Add new book"
                    echo "Title: "
                    read title
                    echo $title > BookDB.txt
        
                    echo "Author: "
                    read name
                    echo $name > BookDB.txt
        
                    echo "$title successfully added!"
                    break
                    ;;
        
                Remove) echo "Remove existing book info"
                    sed '$NAME' BookDB.txt
                    break
                    ;;
        
                update) echo "Update book info and quantity"
                    echo "Title: "
                    read title
                    echo $title < BookDB.txt
        
                    echo "Author: "
                    read name
                    echo $name < BookDB.txt
                    break
                    ;;
        
                search) echo "Search for book by title/author"
                    break
                    ;;
        
                process) echo "Process a book sold"
                    break
                    ;;
        
                inventory) echo "Inventory summary report"
                    break
                    ;;
        
                quit) echo "Quit"
                    exit
                    ;;
            esac
        done
        

        你可以理解如下代码:

        1. 选择为书准备许多值,分配的值是由于我们输入的内容。输入应该是从 1 开始的整数索引。

        2. 为了进一步了解,您应该了解更多关于 bash 和 select 系统调用的知识。

        【讨论】:

          【解决方案4】:

          试试这个:

          PS3="Please enter your option: "
          select book in Add Remove Update Search Process Inventory Quit
          do
              case $book in
                  "Add") 
                      ...
                      ;;
                  "Remove") 
                      ...
                      ;;
          
                  "Update")
                      ...
                      ;;  
          
                  etc...
          
              esac
          done
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多