সোর্স কোডের মধ্যে রিড-পি প্রম্পটে একটি দীর্ঘ স্ট্রিংকে কীভাবে একাধিক লাইনে বিভক্ত করবেন?


19

আমি একটি ইনস্টলেশন স্ক্রিপ্ট লিখছি যা চলবে /bin/sh

একটি ফাইলের জন্য অনুরোধ করার জন্য একটি লাইন রয়েছে:

read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY

আমি এই দীর্ঘ রেখাটি অনেক লাইনে বিভক্ত করতে চাই যাতে তাদের কোনওটিই 80 টি অক্ষরের বেশি নয় exceed আমি স্ক্রিপ্টের উত্স কোডের মধ্যে থাকা লাইনগুলি সম্পর্কে কথা বলছি ; স্ক্রিপ্টটি কার্যকর হওয়ার সময় যে পংক্তিতে প্রকৃতপক্ষে মুদ্রণ করা হবে সেগুলি সম্পর্কে নয় !

আমি যা চেষ্টা করেছি:

  • ফ্রিস্ট পদ্ধতির:

    read -p "goat can try change directory if cd fails to do so. " \
        "Would you like to add this feature? [Y|n] " REPLY
    

    এটি মুদ্রণ না করায় এটি কাজ করে না Would you like to add this feature? [Y|n]

  • দ্বিতীয় পদ্ধতির:

    echo "goat can try change directory if cd fails to do so. " \
        "Would you like to add this feature? [Y|n] "
    read REPLY
    

    পাশাপাশি কাজ করে না। এটি প্রম্পটের পরে একটি নতুন লাইন প্রিন্ট করে। সহায়তা -nকরার জন্য বিকল্প যোগ করা echo: এটি কেবল প্রিন্ট করে:

    -n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n]
    # empty line here
    
  • আমার বর্তমান কাজ

    printf '%s %s ' \
        "goat can try change directory if cd fails to do so." \
        "Would you like to add this feature? [Y|n] "
    read REPLY
    

এবং আমি আরও ভাল উপায় আছে কিনা ভাবছি।

মনে রাখবেন যে আমি একটি /bin/shসুসংগত সমাধান খুঁজছি ।


1
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি ১. একটি বৃহত্তর টার্মিনাল এবং / অথবা সম্পাদক উইন্ডোটি ব্যবহার করুন (যেমন আমি আমার ১৪৪০ পি মনিটরে ৫১ লাইন টার্মিনাল দ্বারা একটি 192 কলাম ব্যবহার করি - লগ ফাইলগুলি টেলিংয়ের জন্য এবং ভিমে সোর্স কোড সম্পাদনা করার জন্য দুর্দান্ত) এবং 2. গ্রহণ করতে শিখুন কখনও কখনও উত্স কোড লাইন 80 টি অক্ষরের চেয়ে দীর্ঘ হবে - এটি অনিবার্য। যদি আমি একটি ছোট ফন্ট ব্যবহার করি তবে আমার আরও বৃহত্তর টার্মিনাল থাকতে পারে তবে আমার বর্তমান সেটআপটি প্রস্থ এবং সুসংগঠনের মধ্যে একটি ভাল আপস।
কেস

উত্তর:


17

প্রথমত, আসুন একটি ভেরিয়েবল ব্যবহার করে পাঠ্য লাইনটি থেকে পাঠকে ডিকুয়াল করুন:

text="line-1 line-2"             ### Just an example.
read -p "$text" REPLY

এইভাবে সমস্যাটি হয়ে ওঠে: একটি ভেরিয়েবলের জন্য দুটি লাইন কীভাবে নির্ধারণ করা যায়।

অবশ্যই এটি করার প্রথম প্রচেষ্টাটি হ'ল:

a="line-1 \
line-2"

যে হিসাবে লিখিত, var aআসলে মান পায় line-1 line-2

তবে আপনি এটি পছন্দ করে না এমন ইন্ডেন্টেশনের অভাবটি পছন্দ করেন না, তবে আমরা এখানে একটি ডক থেকে লাইনগুলি ভারে পড়ার চেষ্টা করতে পারি (সচেতন থাকুন যে এখানে-ডকটির অভ্যন্তরে প্রবেশিত রেখাগুলির জন্য একটি ট্যাব প্রয়োজন, স্থানগুলি নয়, সঠিকভাবে কাজ করতে):

    a="$(cat <<-_set_a_variable_
        line-1
        line-2
        _set_a_variable_
    )"
echo "test1 <$a>"

তবে এটি ব্যর্থ হবে যেহেতু দুটি লাইনে লিখিত আছে $a। কেবলমাত্র একটি লাইন পাওয়ার জন্য কাজটি হতে পারে:

    a="$( echo $(cat <<-_set_a_variable_
        line 1
        line 2
        _set_a_variable_
        ) )"
echo "test2 <$a>"

এটি নিকটে, তবে অন্যান্য অতিরিক্ত সমস্যা তৈরি করে।

সঠিক সমাধান।

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

একটি খুব বেসিক এবং সহজ পদ্ধতির হ'ল:

a="line-1"
a="$a line-2"
read -p "$a" REPLY

আপনার নির্দিষ্ট উদাহরণের কোডটি (যে কোনও শেলের পক্ষে যার readসমর্থন করে -p):

#!/bin/dash
    a="goat can try change directory if cd fails to do so."
    a="$a Would you like to add this feature? [Y|n] "
# absolute freedom to indent as you see fit.
        read -p "$a" REPLY

অন্যান্য সমস্ত শেলের জন্য, ব্যবহার করুন:

#!/bin/dash
    a="goat can try change directory if cd fails to do so."
    a="$a Would you like to add this feature? [Y|n] "
# absolute freedom to indent as you see fit.
        printf '%s' "$a"; read REPLY

আমি জানি বাইনারিজেব্রা আমি কেবল "কোনও শেলের জন্য" সংশোধন করেছি যেহেতু সমস্ত শেলগুলি পড়েনি এবং -p রয়েছে এমন সমস্তগুলি নয়।
টেরডন

@ এটারডন আমরা উভয়ই একমত হয়েছি ধন্যবাদ কারণের জন্য কারণ :-)। আবার ধন্যবাদ.

1

লাইনগুলির শেষে ব্যাকস্ল্যাশ আউটপুটটিতে প্রকৃত লাইন বিরতি নয়, একাধিক লাইনের উপরে কমান্ডের ধারাবাহিকতাকে অনুমতি দেয়।

সুতরাং আপনার প্রথম পদ্ধতির, উদাহরণস্বরূপ, আদেশ হয়ে যায়

read -p "goat can try change directory if cd fails to do so. " "Would you like to add this feature? [Y|n] " REPLY

আপনি কেন একাধিক লাইন আউটপুট পড়তে চান তা নিশ্চিত নই, তবে আমি কেবল readপ্রম্পট লাইন এবং echoপূর্ববর্তী লাইনের জন্য ব্যবহার করব ।

একাধিক লাইনের মাধ্যমে কোডটিকে আরও পঠনযোগ্য করে তুলতে, লাইনের মধ্যে আপনার উদ্ধৃতিগুলি বন্ধ / খুলবেন না।

এটা চেষ্টা কর:

read -p "goat can try change directory if cd fails to do so. \
Would you like to add this feature? [Y|n] " REPLY

আমি এটি দুটি লাইন মুদ্রণ করতে চান না! আমি কেবল স্ক্রিপ্টের সোর্স কোডে কোডটি প্রতি লাইনে 80 টি অক্ষরে ফিট করতে চাই ! যদিও উত্তরের জন্য আপনাকে ধন্যবাদ :)
ম্যাটিউজ পিয়োত্রস্কি

আপনার প্রস্তাবিত পদ্ধতির পছন্দ করি না কারণ কোনও ইন্ডেন্টেশন নেই। যদি আমার readকোনও ক্রিয়াকলাপের মধ্যে ইন্টেন্টেড থাকে তবে আপনার পদ্ধতির পাঠযোগ্যতার গোলমাল মনে হচ্ছে।
ম্যাটিউজ পিয়োত্রস্কি 27'16

1

আমি পরিষ্কার হয়ে উঠতে একটি ভেরিয়েবল ব্যবহার করে @ বাইনারিজেব্রার পদ্ধতির সন্ধান করি তবে আপনি যেভাবে চেষ্টা করছেন সেভাবে আপনি এটিও করতে পারেন। আপনার কেবল উদ্ধৃতিগুলির মধ্যে রেখা বিরতি রাখা দরকার:

read -p "goat can try change directory if cd fails to do so. \
Would you like to add this feature? [Y|n] " REPLY

আপনি কি মনে করেন যে প্রতিটি লাইনের পরে নতুন লাইন যুক্ত করা পঠনযোগ্যতা বৃদ্ধি করবে? কারণ আমি \nআমার প্রম্পটে sertোকানোর উপায়টি খুঁজছিলাম না । আমি কেবল কোডটি একাধিক লাইনে বিভক্ত করতে চেয়েছিলাম যাতে প্রতিটি লাইন সর্বাধিক ৮০ অক্ষর দীর্ঘ হয়।
ম্যাটিউজ পিয়োত্রস্কি

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

1
@ ম্যাটিউজপিয়োট্রোস্কি সম্পন্ন হয়েছে, আপনি মূলত যা চেষ্টা করছেন তার একটি কার্যকারী সংস্করণ যুক্ত করেছি।
টেরডন

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