สคริปต์ Bash จะทำงาน แต่ไม่พบคำสั่ง 'จนถึง'


1

ฉันกำลังเขียนสคริปต์ทุบตีสำหรับคลาสที่มีเมนูหลักพร้อมกับเมนูย่อยสองรายการ ฉันยังเขียนสคริปต์ไม่เสร็จ แต่ฉันมีปัญหาฉันยังไม่สามารถแก้ไข:

สคริปต์ของฉันทำงานได้ดี แต่ทุกครั้งที่ฉันเรียกใช้ฉันได้รับข้อผิดพลาดต่อไปนี้ (แต่รหัสของฉันยังคงทำงานตามที่ตั้งใจ):
./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

คุณอาจต้องการอ่านเกี่ยวกับselectคำสั่งผสมซึ่งคุณกำลังปรับใช้ใหม่เป็นส่วนใหญ่
chepner

คำตอบ:


3
until ($choice = q)

ให้ข้อผิดพลาดทางไวยากรณ์เนื่องจากวงเล็บเป็นสาเหตุทำให้คำสั่ง$choice = qถูกเรียกใช้งานในสภาพแวดล้อม subshell aa

ในทุบตีคุณสามารถใช้

until [[ $choice = q ]]

เพื่อตรวจสอบว่าตัวแปรทางเลือกของค่าเท่ากับQ

สำหรับข้อมูลเพิ่มเติมโปรดดูที่ส่วนคำสั่งผสมในคนทุบตี


ขอบคุณมาก! ฉันทำผิดขั้นพื้นฐานสวยฮ่าฮ่า
Powdercake

0

ถ้า $ choice ว่างเปล่าคุณควรเพิ่มตัวละคร ถ้า $ choice สามารถมีอักขระว่างได้คุณควรใช้ ""

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

และอย่าลืมช่องว่างหลังจาก "[" และก่อน "]"!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.