matching "'- বাশ স্ক্রিপ্টের সাথে ম্যাচ করার সময় অপ্রত্যাশিত EOF


37

আমি কেবল একটি বাশ স্ক্রিপ্ট লিখেছি এবং সর্বদা এই EOF- ত্রুটি পেয়েছি।

সুতরাং এখানে আমার স্ক্রিপ্ট (কেবলমাত্র ওএস এক্সে কাজ করে):

#!/bin/bash

#DEFINITIONS BEGIN
en_sq() {
    echo -e "Enabling smart quotes..."
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool true
    status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
            if [ "$status" = "1" ]
                then
                    echo -e "Success! Smart quotes are now enabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
di_sq() {
    echo -e "Disabling smart quotes..."
    defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
    status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
            if [ "$status" = "0" ]
                then
                    echo -e "Success! Smart quotes are now disabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
en_sd() {
    echo -e "Enabling smart dashes..."
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool true
    status=$(defaults read NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool)
            if [ "$status" = "1" ]
                then
                    echo -e "Success! Smart dashes are now enabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
di_sd() {
    echo -e "Enabling smart dashes..."
    defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
    status=$(defaults read NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool)
            if [ "$status" = "0" ]
                then
                    echo -e "Success! Smart dashes are now disabled."
                    SUCCESS="TRUE"
            else
                echo -e "Sorry, an error occured. Try again."
            fi
}
#DEFINITIONS END
#---------------

#BEGIN OF CODE with properties
#This is only terminated if the user entered properties (eg ./sqd.sh 1 1)
if [ "$1" = "1" ]
    then
        en_sq
    elif [ "$1" = "0" ]
        then
            di_sq
fi

if [ "$2" = "1" ]
    then
        en_sd
        #exit 0 if both, $1 and $2 are correct entered and processed.
        exit 0
    elif [ "$1" = "0" ]
        then
            di_sd
            #exit 0 if both, $1 and $2 are correct entered and processed.
            exit 0
fi
#END OF CODE with properties
#---------------------------


#BEGIN OF CODE without properties
#This is terminated if the user didn't enter two properties
echo -e "\n\n\n\n\nINFO: You can use this command as following: $0 x y, while x and y can be either 0 for false or 1 for true."
echo -e "x is for the smart quotes, y for the smart dashes."
sleep 1
echo -e " \n Reading preferences...\n"
status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
if [ "$status" = "1" ]
    then
        echo -e "Smart quotes are enabled."
    elif [ "$status" = "0" ]
    then
        echo -e "Smart quotes are disabled."

    else
        echo -e "Sorry, an error occured. You have to run this on OS X""
fi

status=$(defaults read NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool)
if [ "$status" = "1" ]
    then
        echo -e "Smart dashes are enabled."
    elif [ "$status" = "0" ]
    then
        echo -e "Smart dashes are disabled."

    else
        echo -e "Sorry, an error occured. You have to run this on OS X!"
fi

sleep 3
echo -e "\n\n You can now enable or disable smart quotes."

until [ "$SUCCESS" = "TRUE" ]
do
echo -e "Enter e for enable or d for disable:"
read sq

if [ "$sq" = "e" ]
    then
        en_sq
    elif [ "$sq" = "d" ]
        then
            di_sq
    else
        echo -e "\n\n ERROR! Please enter e for enable or d for disable!"
fi
done
SUCCESS="FALSE"

echo -e "\n\n You can now enable or disable smart dashes."

until [ "$SUCCESS" = "TRUE" ]
do
echo -e "Enter e for enable or d for disable:"
read sq

if [ "$sd" = "e" ]
    then
        en_sd
    elif [ "$sd" = "d" ]
        then
            di_sd
    else
        echo -e "\n\n ERROR! Please enter e for enable or d for disable!"
fi
done

এবং এখানে আমার ত্রুটি:

./coding.sh: line 144: unexpected EOF while looking for matching `"'
./coding.sh: line 147: syntax error: unexpected end of file

উত্তর:


31

আপনি যদি কেবল নিজের প্রশ্নের দিকে নজর দেন তবে আপনি আপনার সমস্যা দেখতে পাবেন। 95 লাইন পরে সিনট্যাক্স হাইলাইটিং কীভাবে স্ক্রু করা হবে তা নোট করুন:

echo -e "Sorry, an error occurred. You have to run this on OS X""

ত্রুটি বার্তাটি যেমন আপনাকে বলে, আপনার সাথে একটি মিল নেই ""উপরের লাইনটি থেকে কেবল অতিরিক্ত সরান এবং আপনার ভাল হওয়া উচিত:

echo -e "Sorry, an error occurred. You have to run this on OS X"

1
আশ্চর্যের বিষয় হল, আমারও একই সমস্যা ছিল এবং এটি ছিল কারণ আমার একটি sudo echo ""লাইন ছিল .. 2 ডাবল উদ্ধৃতিগুলি সরানো, ছেড়ে দেওয়া sudo echoএটিকে পুরোপুরি কার্যকর করে তোলে।
ভিনজি

@vinzee কেন আপনি কি কখনো চালানো হবে echoসঙ্গে sudo? এটি বলেছিল, আপনি যা বর্ণনা করেছেন তা খুব একটা বোঝায় না, নিশ্চয়ই অন্য কিছু চলছে।
টেরডন

আমি করছি sudo echoকারণ স্ক্রিপ্টটির sudoপরে কমান্ডগুলিতে প্রয়োজন হবে তবে আমি চাই যে ব্যবহারকারী তার পাসওয়ার্ডটি খুব তাড়াতাড়ি প্রবেশ করিয়ে দেবে, যাতে স্ক্রিপ্টটির আর কয়েক মিনিটের জন্য তার ইনপুটটির প্রয়োজন না হয়। এবং বাগের জন্য, আমার এখানে একই ত্রুটি ছিল, তবে এটি 2 টি ডাবল উদ্ধৃতিগুলি সরিয়ে সমাধান করা হয়েছিল। আর কিছু হয়নি ..
ভিনজি

1
@ ভিঞ্জি আপনি পড়তে চাইতে পারেন আমি কীভাবে কোনও স্ক্রিপ্টের মধ্যে 'সুডো' কমান্ড চালাব? । উদ্ধৃতি হিসাবে, অবশ্যই অন্য কিছু ছিল। উদাহরণস্বরূপ, মুদ্রার সাথে মুছে ফেলা মুদ্রণের পরে আপনার মুদ্রণবিহীন একটি অক্ষর থাকতে পারে। অথবা হয়ত আপনি দুই একক উদ্ধৃতি ছিল এবং তারপর একটি ডবল ( echo ''") বা ওই জাতীয় কিছু, কিন্তু হতে হয় কিছু যেহেতু echo ""জরিমানা।
টেরডন

লিঙ্কটির জন্য ধন্যবাদ, আপনি ঠিক বলেছেন। দৌড়তে sudo echoকিছুটা অদ্ভুত লাগছে .. এবং আমি আজ রাতে আমার লিনাক্স ইনস্টল করে আবার চেষ্টা করব এবং ফলাফলগুলি এখানে মন্তব্য করতে ফিরে পাব।
ভিনজি

3

এই ত্রুটিটি সত্যিকারের পরিস্থিতিতে ট্র্যাক করা কঠিন। এখানে আমি বাস্তব বিশ্বের পরিস্থিতির জন্য একটি সমাধান সরবরাহ করি। আমি আমার স্ক্রিপ্ট একটি উদাহরণ হিসাবে ব্যবহার করব।

আমি আমার শেল স্ক্রিপ্ট আপডেট করেছি। এটি কার্যকর করার সময় আমি নিম্নলিখিত ত্রুটি বার্তা পেয়েছি:

/somepath/bin/myshellscript: line 1508: unexpected EOF while looking for matching `"'
/somepath/bin/myshellscript: line 1520: syntax error: unexpected end of file

line 1508 elif [ "$project" ]; then

এটিই শেষ পংক্তিতে এক জোড়া ডাবল উদ্ধৃতি রয়েছে।

সাধারণত, আমি আমার শেল স্ক্রিপ্টটি যতবার এটি পরিবর্তন করি ততবার পরীক্ষা করি। এবার, আমি একদিন অপেক্ষা করেছিলাম এবং ভুলে গিয়েছিলাম যেখানে আমি পরিবর্তন করেছি। এই লাইনের (1508) এর আগে কোথাও সমস্যা হয়েছিল। সমস্যাটি হ'ল এমনকি আমি মন্তব্য করেছি লাইন 1508

#elif [ "$project" ]; then

শেল এক্সিকিউটারটি এখনও বলেছিল 1508 লাইনে সমস্যা আছে।

পরবর্তী আমি আসল শেল স্ক্রিপ্টের একটি অনুলিপি তৈরি করেছি। নীচে থেকে পুরো গোছা কোডটি মোছা হচ্ছে। তারপরে নিচের কমান্ড দিয়ে আমার কোডটি বৈধ করুন

bash -n mysbashscript

mybashscript: line 515: unexpected EOF while looking for matching `"'
mybashscript: line 561: syntax error: unexpected end of file

এখন আমার ফাইলটি মূল আকারের 1/3। আমি তত্ক্ষণাত্ সমস্যাটি দেখেছি:

497 prepare_alignment() {
498     local projdir=${1:?"did not give project directory"}
499     local samp=${2:?"did not give sample name"}
500     local merged=${3:?"must give merged bam file name} # here is the problem

কিছু কারণের জন্য, মিল নেই "inside inside এর ভিতরে inside the শেল পার্সার দ্বারা ক্যাপচার করা হয় না This এখানেই শেল পার্সার আরও উন্নত করা যায়।

সমস্যাটি খুঁজে পেতে দ্রুততম অ্যালগরিদম হ'ল নীচের অংশ থেকে আপনার অর্ধেক কোডটি মুছে ফেলা, যদি সিনট্যাক্স ত্রুটিটি চলে যায় তবে এটি এই অর্ধেকের মধ্যে। যদি সিনট্যাক্স ত্রুটিটি এখনও থেকে থাকে তবে সমস্যাটি উপরের অর্ধেকের মধ্যে।

যদি পরে অর্ধেক সমস্যা হয়, মুছে ফেলুন পূর্বে। এই প্রক্রিয়া পুনরাবৃত্তি। সমস্যার উত্সটি খুঁজতে আপনি একটি ছোট আকারে সংকীর্ণ করতে পারেন।

কোড মোছার সময়, আপনাকে কোডের পুরো বিভাগটি মুছতে হবে। উদাহরণস্বরূপ পুরো ফাংশন।

আপনি হয় বাশ-এন স্ক্রিপ্টনাম ব্যবহার করতে পারেন বা সরাসরি স্ক্রিপ্টটি কার্যকর করতে পারেন। দুজনেরই কাজ করা উচিত।


1
"কিছু কারণে, অপ্রতিম" ভিতরে {} শেল পার্সার ক্যাপচার না। "এটা কি ঠিক চিহ্নগুলি সিন্টেক্সের কারণ, এটা হয় মিলেছে, লাইন 1508 উপর? অর্থাত স্ট্রিং লাইন 500 খোলা লাইন 1508 তারপর অন্য বন্ধ করা হবে, এবং স্ট্রিংটি 1508 এ খোলা হয় যা কখনই বন্ধ হয় না
ফিলিপ

বাশের উদ্ধৃতিদানের আচরণটি আমি তদন্ত করি নি। বাশের মাল্টি-লাইনের উক্তি "লাইন 1 line nline2" থাকতে পারে আমি শেলটিতে মনে করি আপনি << এন্ডমার্কের সাথে মাল্টি-লাইন উদ্ধৃতি করেন। সম্ভবত আপনি এখন একাধিক লাইন উদ্ধৃত করতে ডাবল উদ্ধৃতি ব্যবহার করতে পারেন। এই বৈশিষ্ট্যটি ডিবাগটিকে সত্যই শক্ত করে তোলে।
কেমিন চিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.