1

Я пишу bash-скрипт для класса, у которого есть главное меню с двумя подменю. Я еще не закончил свой сценарий, но у меня уже есть проблема, которую я не смог исправить:

Мой сценарий работает нормально, но каждый раз, когда я запускаю его, я получаю следующую ошибку (но мой код все еще выполняется как задумано):
./menu1.sh: line 105: =: command not found

Кроме того, когда я вхожу в два других подменю, я получаю ту же ошибку (из-за схожего кода): ./menu1.sh: line 7: e: command not found
./menu1.sh: line 79: r: command not found

Строка, которая вызывает ошибку: until ($choice = q); который я использую, чтобы остаться в каждом отдельном меню, пока пользователь не введет q .

Добавление set -x в мой код показывает + = q прямо перед тем, как вывести ошибку.

Ввод, which until в терминал, ничего не даст (он не выводит пути).

Наконец, набрав echo $SHELL печатает /bin/bash поэтому я использую bash.

Вот весь мой исходный код (незаконченный):

#!/bin/bash

q=
cNum=
cNum1=
editSub () {
until ($choice = q); #ERROR OCCURS HERE
do
    echo ""
    echo "Edit Submenu:"
    echo ""
    echo "(a) Add a course"
    echo "(d) Delete a course"
    echo "(p) Display a course"
    echo "(u) Update a course (status and/or grade)"
    echo "(q) Return to Main Menu"
    echo ""
    echo -n "Enter choice: "
    read choice

    case $choice in
    a) 
    echo -n "Course Number:"
    read cNum
    if (grep $cNum my_course)
    then
        echo "$cNum already exists!"
    else
        awk '/'$cNum'/ {printf $1$2 OFS $4 OFS $5 OFS $6 OFS $7 OFS $8" 0 N/A"}' courses.txt | cat >> my_course #THIS NEEDS WORK. clear the extra stuff and add integer credit value
    fi
    ;;
    d)
    echo -n "Course Number: "
    read cNum
    if (grep $cNum my_course)
    then
        sed --in-place '/'$cNum'/d' my_course
        echo "$cNum successfully deleted."
    else
        echo "Course does not exist."
    fi
    ;;
    p) 
    echo -n "Course Number: "
    read cNum
    if (grep $cNum my_course)
    then
        awk'/'$cNum'/ {printf "Course Number: "$1"'
        #print the rest of the course info in a pretty format
    else
        echo "Course does not exist."
    fi
    ;;
    u)
    echo -n "Course Number: "
    read cNum
    echo -n "Status: "
    read status
    echo -n "Grade: "
    read grade
    if (grep $cNum my_course)
    then
        date
        #validate input for status and grade
        #if status 0 or 1, change my_course to say so
        #grade ABC, 1. N/A, 0.
        #error message if invalid input
    else
        echo "Course does not exist."
    fi
    ;; #FINISH THIS
    q) return ;;
    *) echo "Invalid choice.";;
    esac
done
}

reportSub () {
until ($choice = q); #ERROR OCCURS HERE
do
    echo ""
    echo "Report Submenu:"
    echo ""
    echo "(a) Sort by course number"
    echo "(p) Display all courses that you have taken"
    echo "(g) Calculate the GPA"
    echo "(q) Return to Main Menu"
    echo ""
    echo -n "Enter choice: "
    read choice

    case $choice in
    a) sort -n my_course
    ;;
    p) grep ' 1 ' my_course | sort
    ;;
    g) date ;; #calculate GPA
    q) return ;;
    *) echo "Invalid choice.";;
    esac
done
}

#main function
until ($choice = q); #ERROR OCCURS HERE
do
if [ -f my_course ]
then
    echo ""
    echo "Main Menu:"
    echo ""
    echo "(e) Edit Submenu"
    echo "(r) Report Submenu"
    echo "(q) Quit"
    echo ""
    echo -n "Enter choice: "
    read choice

    case $choice in
        e) editSub ;;
        r) reportSub ;;
        q) exit ;;
        *) echo "Invalid choice.";;
    esac
else
    >> my_course
fi
done
exit

2 ответа2

3
until ($choice = q)

дает синтаксическую ошибку, так как круглые скобки приводят к выполнению команды $choice = q в среде подоболочек.

В Bash вы можете использовать

until [[ $choice = q ]]

проверить, равно ли значение выбора переменной q.

Для получения дополнительной информации см. Раздел Составные команды в man bash.

0

если $ choice может быть пустым, вы должны добавить символ. если $ choice может содержать пустые символы, вы должны использовать "".

until [ "_$choice" = "_q" ]
do
done

И не забывайте пробелы после "[" и до "]"!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .