Скрипты Bash 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 не появляются после того, как я ввел 1. и даже если я выбрал Выйти, он не вернется в меню. как мне заставить его работать?:(

Любая помощь с благодарностью. Спасибо!:)

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

От bash manpage (мой курсив и жирный шрифт):

select name [ in word ] ; do list ; done

Список следующих за ним слов расширяется, генерируя список элементов. Набор расширенных слов напечатан на стандартной ошибке, каждому из которых предшествует число. Если слово in опущено, позиционные параметры печатаются (см. ПАРАМЕТРЫ ниже).

Затем отобразится приглашение PS3 и строка будет считана со стандартного входа.

Если строка состоит из числа, соответствующего одному из отображаемых слов, этому значению присваивается значение имени .

Если строка пуста, слова и подсказка отображаются снова. Если EOF читается, команда завершается.

Любое другое прочитанное значение приводит к тому, что name устанавливается в null. Считанная строка сохраняется в переменной REPLY. Список выполняется после каждого выбора, пока не будет выполнена команда прерывания.

Статусом завершения выбора является статус выхода последней команды, выполненной в списке, или ноль, если команды не были выполнены.

Следовательно, в вашем case Скажите, вам нужно "Add" скорее, чем 1То же самое для других.


Вы также должны посмотреть, что вы на самом деле делаете в каждом конкретном случае. Очевидно, что последние пусты, потому что вы еще не дошли до них, но ваше использование sed во втором случае ничего не удалит из файла как есть. И для третьего случая:

echo $title < BookDB.txt

в... интересно. Если бы это было перенаправление вывода, я мог бы понять начало плана, но строка, которая у вас есть, просто выведет $title и полностью игнорировать содержимое вашего перенаправления ввода.

Не сомневаюсь, что вы исправите их вовремя, я просто подумал, что смогу обратить на них внимание, как на что-то, на что нужно посмотреть

Замещать

select book in Add Remove update search process inventory quit

С:

select book in 1 2 3 4 5 6 7 

Под оператором 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 и выбрать системный вызов.

Другие вопросы по тегам