O script bash é executado, mas o comando 'until' não foi encontrado

1

Estou escrevendo um script para uma classe que tem um menu principal com dois submenus. Ainda não terminei meu roteiro, mas já tenho um problema que não consegui resolver:

Meu script é executado corretamente, mas toda vez que o executo, recebo o seguinte erro (mas meu código ainda é executado como pretendido):% ./menu1.sh: line 105: =: command not found

Além disso, quando eu entro nos outros dois submenus, recebo o mesmo erro (devido a código semelhante): ./menu1.sh: line 7: e: command not found e ./menu1.sh: line 79: r: command not found

A linha que está causando o erro é: until ($choice = q); , que estou usando para ficar em cada menu individual até que o usuário insira q .

Adicionar set -x ao meu código mostra + = q antes de imprimir o erro.

Digitar which until no terminal não produz resultado (não imprime nenhum caminho).

Por fim, digitar echo $SHELL imprime /bin/bash , então estou usando o bash.

Aqui está todo o meu código fonte (inacabado):

#!/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
    
por Powdercake 27.03.2013 / 02:38

2 respostas

3
until ($choice = q)

fornece um erro de sintaxe, pois os parênteses fazem com que o comando $choice = q seja executado em um ambiente de subshell.

No bash, você pode usar

until [[ $choice = q ]]

para verificar se o valor da variável choice é igual a q .

Para maiores informações, veja a seção Compound Commands em man bash .

    
por 27.03.2013 / 02:45
0

se $ choice pode estar vazio, você deve adicionar um caractere. se $ choice puder ter caracteres em branco, você deve usar "".

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

E não se esqueça dos espaços depois de "[" e antes de "]"!

    
por 25.02.2014 / 16:20