EOF ที่ไม่คาดคิดและข้อผิดพลาดทางไวยากรณ์


9

ขณะนี้ฉันกำลังเขียนเชลล์สคริปต์ตัวที่สามของฉันและฉันพบปัญหา นี่คือสคริปต์ของฉัน:

#!/bin/bash
echo "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script"

while read  
do  
 case in  
        1) who;;  
        2) ls -a;;  
        3) cal;;  
        4) exit;;  
 esac    
done

เมื่อฉันพยายามเรียกใช้สคริปต์ข้อความนี้จะบอกว่า:

line2 : unexpected EOF while looking for matching '"'  
line14 : syntax error: unexpected end of file.    

ผมทำอะไรผิดหรือเปล่า?


1
คุณหมายถึง "EOF" ไม่ใช่ "ECF" ใช่หรือไม่
l0b0

คำตอบ:


5

ปัญหาคือว่าcaseคำสั่งของคุณจะหายไปเรื่อง - ตัวแปรที่ควรประเมิน ดังนั้นคุณอาจต้องการสิ่งนี้:

#!/bin/bash
cat <<EOD
choose one of the following options:
1) display all current users
2) list all files
3) show calendar
4) exit script
EOD

while true; do
    printf "your choice: "
    read
    case $REPLY in
        1) who;;
        2) ls -a;;
        3) cal;;
        4) exit;;
    esac    
done

ที่นี่caseใช้ตัวแปรเริ่มต้น$REPLYซึ่งreadเติมเมื่อไม่ได้รับชื่อตัวแปรใด ๆ (ดูhelp readรายละเอียด)

โปรดสังเกตการเปลี่ยนแปลง: printfใช้เพื่อแสดงพรอมต์ในแต่ละรอบ (และไม่ต่อท้ายบรรทัดใหม่) catใช้ในการพิมพ์คำแนะนำในหลายบรรทัดเพื่อไม่ให้มีการพันและง่ายต่อการอ่าน


6

อย่าลืมselect:

choices=( 
    "display all current users" 
    "list all files" 
    "show calendar" 
    "exit script"
)
PS3="your choice: "
select choice in "${choices[@]}"; do
    case $choice in
        "${choices[0]}") who;;
        "${choices[1]}") ls -a;;
        "${choices[2]}") cal;;
        "${choices[3]}") break;;
    esac
done

1
ดูเหมือนว่าคำตอบที่ดีที่สุดจนถึงตอนนี้ มันใช้การเลือกที่ถูกออกแบบมาเพื่อทำสิ่งที่ OP ต้องการ มันทำให้ตัวเลือกในอาร์เรย์ซึ่งเป็นวิธีที่ดีในการจัดการข้อมูลเช่นนี้และทำให้สามารถใช้ได้ที่อื่นในสคริปต์ มันใช้ตัวแบ่งมากกว่าออกเพื่อให้สคริปต์สามารถทำอย่างอื่นหลังจากส่วนนี้เสร็จสิ้น
Joe

2

ให้เราลองกรณีเดียวในตอนแรก ฉันจะใช้read -pเพื่ออ่านอินพุตของผู้ใช้ลงในตัวแปรoptตามด้วยคำสั่ง case ตามด้านล่าง

#!/bin/bash
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt
case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac

สคริปต์ด้านบนใช้งานได้ดีและตอนนี้ฉันเชื่อว่าคุณจำเป็นต้องใช้สคริปต์แบบวนซ้ำเพื่อให้คุณสามารถอ่านอินพุตของผู้ใช้จนกว่าผู้ใช้จะกดตัวเลือก 4

เราสามารถทำได้โดยใช้whileลูปดังนี้ ฉันตั้งค่าตัวแปรoptด้วยค่าเริ่มต้นเป็น 0 ทีนี้ฉันวนซ้ำในwhileลูปตราบใดที่optตัวแปรมีค่าเป็น 0 (ซึ่งเป็นสาเหตุที่ฉันรีเซ็ตoptตัวแปรเป็น 0 ที่ส่วนท้ายของcaseคำสั่ง)

#!/bin/bash
opt=0;
while [ "$opt" == 0 ]
do
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt

case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac
opt=0
done

0

ฉันจะใส่ "ขณะ" ที่จุดเริ่มต้นของรหัสเป็นการส่วนตัว หากคุณตามด้วย a :จะอนุญาตให้วนซ้ำหลาย ๆ ครั้งตามที่คุณต้องการ นี่คือวิธีที่ฉันจะเขียนมัน

while :
do
    echo "choose one of the following options : \
      1) display all current users \
      2) list all files \
      3) show calendar \
      4) exit script"
    read string
    case $string in
        1)
            who
            ;;

จากนั้นดำเนินการกับคำถามและจบด้วย

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