অপ্রত্যাশিত 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.