Похожие вопросы

Копирование нескольких файлов в Linux
Linux: как убить корневой процесс по имени параметра?
Разделить окно программно с iTerm?
Символы UTF8 в терминале bash windows 10
Samba net команда для завершения работы Windows 8 машина [дубликат]
Как я могу получить путь монтирования USB-устройства на OSX?
"read" работает как ожидалось в ZSH, но ведет себя по-другому при использовании любой другой оболочки
$ logout bash: выход: не войти оболочка: использовать выход'
Как отключить трекпад / мышь через командную строку Mac OS X?
Загрузка нескольких файлов с ftp-сервера с помощью сценария bash
команда diskutil не найдена в терминале OS X
Как копировать файлы с помощью ditto с обратными косыми чертами в именах файлов
gnu parallel: пересылать все stdin во все процессы
Как поставить в очередь несколько файлов для копирования на Mac?
Как проверить, доступно ли подключение к Интернету через терминал

Скрипт Bash выполняется, но команда' until ' не найдена

Я пишу 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  OFS  OFS  OFS  OFS  OFS " 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: ""'
        #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
5
задан Andrea
источник

2 ответов

until ($choice = q)

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

в bash, вы можете использовать

until [[ $choice = q ]]

чтобы проверить, если переменная выбор's значение равно q.

для получения дополнительной информации см. раздел Команды Соединение in человек Баш.

3
отвечен Dennis 2013-03-27 01:45:18
источник

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

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

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

0
отвечен Vouze 2014-02-25 15:20:06
источник

Другие вопросы bash script shell