Beklenmeyen EOF ve sözdizimi hatası


9

Şu anda üçüncü kabuk betiğimi yazıyorum ve bir sorunla karşılaştım. Bu benim senaryom şu ana kadar:

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

komut dosyasını çalıştırmayı denediğimde şöyle diyor:

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

Neyi yanlış yapıyorum?


1
Şüphesiz "ECF" değil "EOF" mu demek istediniz?
l0b0

Yanıtlar:


5

Sorun şu ki case, ifadenizde konu eksik - değerlendirmesi gereken değişken. Dolayısıyla muhtemelen böyle bir şey istersiniz:

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

İşte casevarsayılan değişkeni kullanır $REPLYhangi reado (bkz herhangi değişken adları verilir değilken doldurur help readdetaylar için).

Ayrıca değişikliklere dikkat edin: printfher turda bilgi istemini görüntülemek için kullanılır (ve yeni satır eklemez), catsarılmaması ve okunması daha kolay olması için talimatları birkaç satıra yazdırmak için kullanılır.


6

Unutmayalım 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
Bu şimdiye kadarki en temiz cevaba benziyor. OP'nin tam olarak istediği şeyi yapmak için tasarlanmış olan seçimi kullanır. Seçimleri böyle bir veriyi işlemenin harika bir yolu olan bir diziye koyar ve betiğin başka bir yerinde kullanılabilir hale getirir. Bu bölüm bittikten sonra komut dosyasının başka bir şey yapabilmesi için çıkış yerine mola kullanır.
Joe

2

Başlangıçta tek bir dava deneyelim. Ben aşağıdaki gibi case deyimi takip read -pbir değişken içine kullanıcı girişi okumak için kullanacağım opt.

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

Yukarıdaki komut dosyası iyi çalışıyor ve şimdi, kullanıcı seçenek 4'e basana kadar kullanıcı girişini okuyabilmeniz için bir döngüde olması gerektiğine inanıyorum.

Yani, whileaşağıdaki gibi bir döngü ile yapabiliriz . Ben optilk değeri ile değişken 0 olarak ayarlayın. Şimdi, değişken 0 olarak bir değer olduğu whilesürece döngüde yineleme opt(bu yüzden deyimin optsonunda değişkeni 0 olarak sıfırlar 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

Ben şahsen kodun başında "while" koymak istiyorum. Daha sonra a ile takip ederseniz, istediğiniz :kadar döngü yapmasına izin verecektir. Ben böyle yazardım.

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

sonra soruları devam ettirin ve

esac
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.