Bash Shell脚本 - 选择案例菜单不起作用

时间:2015-01-15 02:59:55

标签: bash shell echo select-case

我对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

及以下是shell commands

中的Ubuntu terminal
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中的单词不会出现。即使我选择退出,它也不会返回菜单。我怎么让它工作? :(

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

4 个答案:

答案 0 :(得分:2)

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

  

select name [ in word ] ; do list ; done

     

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

     

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

     

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

     

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

     

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

     

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

因此,在您的case声明中,您需要"Add"而不是1,而其他人则需要这样做。


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

echo $title < BookDB.txt

in ...有趣。如果它是输出重定向,我可以理解计划的开头,但是你拥有的行只会输出$title并完全忽略输入重定向的内容。

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

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:0)

替换

select book in Add Remove update search process inventory quit

使用:

select book in 1 2 3 4 5 6 7 

答案 3 :(得分:0)

在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. 选择为book准备多个值,分配的值取决于我们输入的内容。输入应该从1开始整数索引。

  2. 为了进一步了解,您应该了解bash并选择系统调用。