Kesalahan EOF dan sintaks yang tidak terduga


9

Saat ini saya sedang menulis skrip shell ketiga saya dan saya mengalami masalah. Ini skrip saya sejauh ini:

#!/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

ketika saya mencoba menjalankan skrip dikatakan:

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

Apa yang saya lakukan salah?


1
Tentunya maksud Anda "EOF", bukan "ECF"?
l0b0

Jawaban:


5

Masalahnya adalah, bahwa casepernyataan Anda kehilangan subjek - variabel yang harus dievaluasi. Karenanya Anda mungkin menginginkan sesuatu seperti ini:

#!/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

Di sini casemenggunakan variabel default $REPLYyang readmengisi ketika tidak diberi nama variabel apa pun (lihat help readdetailnya).

Perhatikan juga perubahan: printfdigunakan untuk menampilkan prompt di setiap putaran (dan tidak menambahkan baris baru), catdigunakan untuk mencetak instruksi pada beberapa baris sehingga tidak membungkus dan lebih mudah dibaca.


6

Jangan lupa 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
Ini sepertinya jawaban terbersih sejauh ini. Ini menggunakan pilih yang dirancang untuk melakukan apa yang dibutuhkan OP. Itu menempatkan pilihan dalam array yang merupakan cara terbaik untuk menangani data seperti ini dan membuatnya tersedia untuk digunakan di tempat lain dalam skrip. Ini menggunakan istirahat daripada keluar sehingga skrip dapat melakukan sesuatu yang lain setelah bagian ini selesai.
Joe

2

Mari kita coba satu kasus pada awalnya. Saya akan gunakan read -puntuk membaca input pengguna ke dalam variabel optdiikuti dengan pernyataan kasus seperti di bawah ini.

#!/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

Script di atas berfungsi dengan baik dan sekarang, saya percaya Anda harus memilikinya dalam satu lingkaran sehingga Anda dapat membaca input pengguna sampai pengguna menekan opsi 4.

Jadi, kita bisa melakukannya dengan whileloop seperti di bawah ini. Saya mengatur variabel optdengan nilai awal sebagai 0. Sekarang, saya mengulangi dalam whileloop selama optvariabel memiliki nilai 0 (itulah sebabnya saya me-reset optvariabel sebagai 0 pada akhir casepernyataan).

#!/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

Saya pribadi akan meletakkan "sementara" di awal kode. Jika Anda kemudian mengikutinya dengan a :, itu akan memungkinkannya untuk berputar sebanyak yang Anda inginkan. Ini adalah bagaimana saya akan menulisnya.

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
            ;;

kemudian lanjutkan pertanyaan, dan akhiri dengan

esac
done
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.