अप्रत्याशित 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
निश्चित रूप से आपका मतलब है "ईओएफ", "ईसीएफ" नहीं?
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
यह अब तक का सबसे साफ जवाब लगता है। यह उस चयन का उपयोग करता है जिसे ओपी के लिए ठीक वही करने के लिए डिज़ाइन किया गया था। यह विकल्पों को एक सरणी में रखता है जो इस तरह से डेटा को संभालने का एक शानदार तरीका है और इसे स्क्रिप्ट में कहीं और उपयोग करने के लिए उपलब्ध कराता है। यह बाहर निकलने के बजाय ब्रेक का उपयोग करता है इसलिए इस भाग के किए जाने के बाद स्क्रिप्ट कुछ और कर सकती है।
जो

2

आइए हम शुरू में एकल मामले के लिए प्रयास करें। मैं नीचे के रूप में मामले के बयान के बाद read -pएक चर में उपयोगकर्ता इनपुट को पढ़ने के लिए उपयोग करेगा 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

उपरोक्त स्क्रिप्ट ठीक काम करती है और अब, मेरा मानना ​​है कि आपको इसे लूप में रखने की आवश्यकता है ताकि आप उपयोगकर्ता इनपुट को पढ़ सकें जब तक कि उपयोगकर्ता विकल्प 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

मैं व्यक्तिगत रूप से कोड की शुरुआत में "जबकि" डालूंगा। यदि आप इसे एक के साथ पालन करते हैं :, तो यह आपको जितनी बार चाहें उतनी बार लूप करने की अनुमति देगा। यह मैं इसे कैसे लिखूंगा।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.