1

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

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

任何帮助是极大的赞赏。谢谢!:)

4

4 回答 4

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并完全忽略输入重定向的内容。

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

于 2015-01-15T03:19:45.863 回答
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
于 2015-01-15T03:09:43.890 回答
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. 选择为书准备许多值,分配的值是由于我们输入的内容。输入应该是从 1 开始的整数索引。

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

于 2015-01-15T03:38:42.220 回答
0

代替

select book in Add Remove update search process inventory quit

和:

select book in 1 2 3 4 5 6 7 
于 2015-01-15T03:13:40.050 回答