ইন্টেন্টেড অবস্থায় একাধিক লাইনের উপরে কোনও ভেরিয়েবলের স্ট্রিংয়ের মান নির্ধারণ কীভাবে করবেন?


54

সমস্যাটি:

  1. আমার একটি ভেরিয়েবলের এমন মান নির্ধারণ করা দরকার যা শালীনভাবে দীর্ঘ।
  2. আমার স্ক্রিপ্টের সমস্ত লাইন অবশ্যই একটি নির্দিষ্ট সংখ্যক কলামের আওতায় থাকতে হবে।

সুতরাং, আমি একাধিক লাইন ব্যবহার করে এটি নির্ধারণ করার চেষ্টা করছি।

ইনডেন্ট ব্যতীত এটি সহজ:

VAR="This displays without \
any issues."
echo "${VAR}"

ফলাফল:

This displays without any issues.

তবে ইনডেন্ট সহ:

    VAR="This displays with \
    extra spaces."
    echo "${VAR}"

ফলাফল:

This displays with      extra spaces.

আমি এই স্থানগুলি ছাড়াই কীভাবে মার্জিতভাবে এটি নির্ধারণ করতে পারি?

উত্তর:


30

এখানে সমস্যাটি হচ্ছে আপনি ডাবল উদ্ধৃতি ("") দিয়ে ভেরিয়েবলটি ঘিরে আছেন। এটি সরান এবং জিনিস ভাল কাজ করবে।

    VAR="This displays with \
    extra spaces."
    echo ${VAR}

আউটপুট

 This displays with extra spaces.

এখানে সমস্যাটি হ'ল ডাবলকে একটি ভেরিয়েবলের উদ্ধৃতি দেওয়া সমস্ত সাদা স্থানের অক্ষর সংরক্ষণ করে। আপনার যদি স্পষ্টভাবে এটির প্রয়োজন হয় তবে এটি ব্যবহার করা যেতে পারে।

উদাহরণ স্বরূপ,

$ echo "Hello     World    ........ ...            ...."

মুদ্রণ করবে

Hello     World    ........ ...            ....

এবং উদ্ধৃতিগুলি অপসারণ করার ক্ষেত্রে, এটির ভিন্ন

$ echo Hello     World    ........ ...            ....
Hello World ........ ... ....

এখানে বাশ পাঠ্যের অতিরিক্ত স্থান সরিয়ে দেয় কারণ প্রথম ক্ষেত্রে পুরো পাঠটিকে "একক" যুক্তি হিসাবে গ্রহণ করা হয় এবং এইভাবে অতিরিক্ত স্থান সংরক্ষণ করে। তবে দ্বিতীয় ক্ষেত্রে echoকমান্ডটি 5 টি আর্গুমেন্ট হিসাবে পাঠ্যটি গ্রহণ করে।

কমান্ডগুলিতে যুক্তিগুলি পাস করার সময় একটি ভেরিয়েবলের উদ্ধৃতিও সহায়ক হবে।

নীচের কমান্ডে, echoকেবলমাত্র একক যুক্তি পায়"Hello World"

$ variable="Hello World"
$ echo "$variable"

তবে নীচের দৃশ্যের ক্ষেত্রে এবং echoহিসাবে দুটি আর্গুমেন্ট পাওয়া যায়HelloWorld

$ variable="Hello World"
$ echo $variable

বেশিরভাগ উত্তরগুলি ভাল কাজ করেছিল, তবে এটি ছিল সবচেয়ে সহজ। ধন্যবাদ!
Sman865

12
@ Sman865 - দয়া করে আমাকে বিশ্বাস করুন যখন আমি আপনাকে বলি যে এটি আসলেই এখানে দেওয়া সবচেয়ে জটিল উত্তর, এবং এটি বেশিরভাগ ক্ষেত্রেই ভুল - বিশেষত এটির উদ্বোধনী ঘোষণায়। মান অ্যাসাইনমেন্টের আশেপাশের কোনও সমস্যা তার পরবর্তী প্রসারের সাথে সম্পর্কিত কোনওভাবেই হতে পারে না - এটি কেবল পিছনের দিকে। আমি দুঃখিত কান্নান, তবে এই উত্তরটি ভুল এবং ভুল-মাথা উভয়ই। ক্ষেত্র-বিভাজন বিস্তৃতকরণ $IFSএকটি শক্তিশালী এবং সর্বজনীন সরঞ্জাম - তবে এইভাবে লিখিত কোড কোনও প্রকারের নির্ভরযোগ্য ফলাফল আনতে পারে না।
মাইকজার্ভ

2
কোনও ভেরিয়েবল প্রসারিত করার সময় উদ্ধৃতি ব্যবহার করতে ব্যর্থ হওয়া খুব শীঘ্রই বা পরে ফাইলের নাম সম্প্রসারণ (যে কোনও * ? []) দিয়ে সমস্যার সৃষ্টি করে ।
মিঃ স্পুর্যাটিক

আমি সম্মত হই যে ভেরিয়েবলগুলি বাশ প্রসারণ থেকে রোধ করতে ডাবল কোটের ভিতরে ভেরিয়েবলগুলি আবদ্ধ করা দরকার। তবে বিশেষ ক্ষেত্রে আমরা কোডের জটিলতা রোধ করতে এড়াতে পারি।
কান্নান মোহন ২

1
আমি @ মিমকিজারের সাথে একমত, ফেসবুকের মূল্য বিবেচনা করা হলে এটি খুব খারাপ পরামর্শ। পরিণতি ছাড়াই ব্যবহার করা হলে এটি ভেঙে যাবে। উদাহরণস্বরূপ, যদি ভেরিয়েবলটি একটি কমান্ডের আর্গুমেন্ট হিসাবে পাস করা হয়, আপনি চান না যে প্রতিটি শব্দ পৃথক যুক্তি হিসাবে বিভক্ত হয়ে যায়।
হরিদসভ

28

এসুওকসু এবং মিকৈল বুকাস প্রদত্ত সমাধানগুলি এটি করার সাধারণ এবং আরও বহনযোগ্য উপায়।

এখানে কয়েকটি bashসমাধান রয়েছে (যার মধ্যে কয়েকটি অন্যান্য শেলগুলিতেও কাজ করা উচিত zsh)। প্রথমত +=সংযোজন অপারেটরের সাথে (যা প্রতিটি পূর্ণসংখ্যের ভেরিয়েবল, নিয়মিত ভেরিয়েবল এবং অ্যারের জন্য কিছুটা ভিন্ন উপায়ে কাজ করে) with

text="Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
text+="tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
text+="quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ..." 

আপনি যদি পাঠ্যে নতুন লাইনের (বা অন্যান্য শ্বেতস্থান / পলায়ন) চান তবে $''পরিবর্তে উদ্ধৃতি ব্যবহার করুন:

text=$'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n'
text+=$'...'

এর পরে, printf -vএকটি ভেরিয়েবলের জন্য বিন্যাসিত মান নির্ধারণ করতে ব্যবহার করুন

printf -v text "%s" "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed " \
                    "do eiusmod empor incididunt ut labore et dolore magna aliqua. "\
                    "Ut enim ad minim veniam ..."

এখানে কৌশলটি এখানে ফর্ম্যাট স্পেসিফায়ারের চেয়ে আরও বেশি যুক্তি রয়েছে, সুতরাং বেশিরভাগ printfফাংশনের বিপরীতে , ব্যাশ ফর্ম্যাট স্ট্রিংটি শেষ না হওয়া পর্যন্ত পুনরায় ব্যবহার করে। আপনি \nফর্ম্যাট স্ট্রিংয়ের মধ্যে একটি রেখে দিতে পারেন , বা হোয়াইটস্পেসের সাথে ডিল করতে $ '', (বা উভয়) ব্যবহার করতে পারেন।

এরপরে, একটি অ্যারে ব্যবহার করে:

text=("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod "
      "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
      "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ..." )

আপনি +=পাঠ্য লাইন আপ লাইন তৈরি করতে ব্যবহার করতে পারেন (নোটটি নোট করুন ()):

text+=("post script")

এখানে যদিও, আপনি যদি একবারে পুরো পাঠ্য সামগ্রী চান তবে আপনাকে অবশ্যই অ্যারে "ফ্ল্যাট" করতে হবে

echo "$text"      # only outputs index [0], the first line
echo "${text[*]}" # output complete text (joined by first character of IFS)

(সংখ্যাসূচক অ্যারেগুলির বিপরীতে পূর্ণসংখ্যার সূচকযুক্ত অ্যারেগুলি সুস্পষ্টভাবে বাছাই করা হয়) এটি আপনাকে সামান্য আরও নমনীয়তা দেয় কারণ আপনি প্রয়োজনে লাইন এবং এমনকি স্লাইস এবং ডাইস পরিচালনা করতে পারবেন ।

অবশেষে, readবা readarrayএকটি "এখানে-নথি" ব্যবহার করে:

read -r -d '' text <<-"EOT"
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
        quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea ...
EOT

readarray -t textarray <<-"EOT"
        Lorem [...]
EOT  

এখানে-ডকুমেন্টের ফর্মটির <<-অর্থ সমস্ত নেতৃস্থানীয় হার্ড ট্যাবগুলি ইনপুট থেকে সরিয়ে ফেলা হয়, সুতরাং আপনার পাঠ্যকে ইনডেন্ট করতে আপনাকে অবশ্যই ট্যাবগুলি ব্যবহার করতে হবে। "EOT"শেল প্রসারণ বৈশিষ্ট্যগুলির চারপাশে উদ্ধৃতিগুলি , সুতরাং ইনপুটটি ভারব্যাটিম ব্যবহৃত হয়। সঙ্গে readএটা NUL বাইট সীমায়িত ইনপুট ব্যবহার করে, তাই এটি পড়তে হবে সম্পর্কে newline এক বারেই টেক্সট সীমায়িত। সঙ্গে readarray(ওরফে mapfile, উপলব্ধ যেহেতু ব্যাশ-4.0) এটা একটি অ্যারের মধ্যে সার্চ, এবং -tপ্রতিটি লাইনে নতুন লাইন রেখাচিত্রমালা।


1
readসঙ্গে বিকল্প here documentখুব সুন্দর হয়েছে! পাইথন স্ক্রিপ্টগুলি এম্বেড করতে এবং এর সাথে চালানো কার্যকর python -c। আমি script=$(cat <here document>)আগে করতাম , তবে read -r -d '' script <here document>আরও ভাল।
হরিদসভ

9

একটি বিশেষ হেরডোক সিনট্যাক্স রয়েছে যা সমস্ত লাইনের শুরুতে ট্যাবগুলি সরিয়ে দেয় : "<< -" (ড্যাশ যুক্ত লক্ষ্য করুন)

http://tldp.org/LDP/abs/html/here-docs.html

উদাহরণ 19-4। একাধিক-লাইনের বার্তা, ট্যাবগুলি দমন করে

আপনি এটি এর মতো ব্যবহার করতে পারেন:

v="$(cat <<-EOF
    A
        B
    C
EOF
)"
echo "$v"

ফলাফল :

A
B
C

এটি কেবল ফাঁকা স্থান নয়, ট্যাবগুলির সাথে কাজ করে।


এখানে উবুন্টুতে, বিপরীতটি সত্য - স্পেস কাজ করে, ট্যাবগুলিতে নয়। \tআপনার যদি ট্যাবগুলির প্রয়োজন হয় তবে দুর্দান্ত কাজ করে। ব্যাকস্ল্যাশ অক্ষরগুলি সক্ষম করার echo -e "$v"পরিবর্তে কেবল ব্যবহার করুনecho "$v"
উইল-ওব

5

শেলটি অযাচিত লাইনফিড এবং নিম্নলিখিত স্থানগুলি খেতে দিন:

$ cat weird.sh 
#!/bin/sh

        var1="A weird(?) $(
             )multi line $(
             )text idea. $(
             )PID=$$"

        var2='You can '$(
            )'avoid expansion '$(
            )'too: PID=$$'

        var3='Or mix it: '$(
            )'To insert the PID use $$. '$(
            )"It expands to e.g. $$."

        echo "$var1"
        echo "$var2"
        echo "$var3"
$ sh weird.sh 
A weird(?) multi line text idea. PID=13960
You can avoid expansion too: PID=$$
Or mix it: To insert the PID use $$. It expands to e.g. 13960.

সুতরাং এটি সম্ভব ... তবে অবশ্যই এই সমাধানটি পছন্দ করা বা অপছন্দ করা স্বাদের বিষয় ...


3
এর প্রত্যেকটিই একটি কাঁটাচামচ।
মাইকজার্ভ

5

হয়তো আপনি এটি চেষ্টা করতে পারেন।

          echo "Test" \
               "Test2" \
               "Test3"

5

এইভাবে আমি আপনাকে পরামর্শ দিচ্ছি যে এটি করা উচিত, এবং আমি কেন তা ব্যাখ্যা করব, তবে প্রথমে আমি অন্য কিছু সম্পর্কে কথা বলতে চাই ...

set -- 'Arg 1: Line 1.' \
       'Arg 2: Line 2.' \
       'and so on for'  \
       'as long as you might like.'
var="$*"

এখানে অন্যান্য প্রচলিত সমাধানগুলি মনে করে যে আপনি কোনওভাবে শেল ভেরিয়েবলের বিষয়বস্তুগুলিকে প্রসারিত করার পদ্ধতি পরিবর্তন করে প্রভাবিত করতে পারেন। আমি আপনাকে আশ্বস্ত করতে পারি এটি এমন নয়।

    string="some stuff here \
            some more stuff here."
    echo $string ${#string} 
    echo "$string" "${#string}"

আউটপুট

some stuff here some more stuff here. 53
some stuff here                 some more stuff here. 53

উপরে আপনি যা দেখছেন তা হ'ল প্রথমে ক্ষেত্র-বিভক্ত সম্প্রসারণ, তারপরে বিস্তারের উত্স পরিবর্তনশীলের জন্য বাইট-কাউন্টের একটি প্রতিবেদন, তারপরে একটি উদ্ধৃতি-বিস্মৃত সম্প্রসারণ এবং একই বাইট-গণনা। যদিও আউটপুট শেল ভেরিয়েবলের বিষয়বস্তু আলাদা হতে পারে $stringতবে অ্যাসাইনমেন্ট ব্যতীত কখনই পরিবর্তন হয় না।

আরও কী, যদি আপনি এটি বুঝতে না পারেন তবে এটির পরে, আপনি খুব শীঘ্রই কিছু খুব বাজে আশ্চর্যর মুখোমুখি হতে বাধ্য। আসুন এটি আবার চেষ্টা করুন, তবে কিছুটা ভিন্ন পরিস্থিতিতে।

    IFS=sf
    echo $string ${#string} 
    echo "$string" "${#string}"

একই $string- বিভিন্ন পরিবেশ।

আউটপুট

 ome  tu   here                  ome more  tu   here. 53
some stuff here                 some more stuff here. 53

ক্ষেত্র বিভাজনে সংজ্ঞায়িত ফিল্ড ডিলিমেটারগুলির উপর ভিত্তি করে ঘটে $IFS। দুটি ধরণের ডিলিমিটার রয়েছে - $IFSহোয়াইটস্পেস এবং $IFSঅন্য কিছু। ডিফল্টরূপে $IFSমান স্পেস ট্যাবকে নতুন লাইন বরাদ্দ করা হয় - এটি তিনটি সম্ভাব্য $IFSহোয়াইটস্পেসের মান। এটি সহজেই পরিবর্তিত হয়েছে, যদিও আপনি উপরে দেখতে পারেন এবং ক্ষেত্র-বিভক্ত বিস্তৃতিতে কঠোর প্রভাব ফেলতে পারে।

$IFSহোয়াইটস্পেস একক ক্ষেত্রের ক্রম অনুসারে এল্ড করবে - এবং এ কারণেই echoকোনও স্থান ফাঁকা রাখলে কোনও স্থানের ক্রমযুক্ত একটি সম্প্রসারণ $IFSকেবলমাত্র একটি স্থানের জন্য মূল্যায়ন করবে - কারণ echoস্পেসগুলির সাথে তার যুক্তিগুলি সংযুক্ত করে। কিন্তু কোনো অ হোয়াইটস্পেস মান একই ভাবে উচ্চারণ না করা হবে না, এবং প্রতিটি ঘটছে বিভেদক সবসময় নিজেই কাছে একটি ক্ষেত্র পায় - যেমন দেখা যায় কাপড় উপরে সম্প্রসারণ।

এটি এর মধ্যে সবচেয়ে খারাপ নয়। এটি অন্য বিবেচনা করুন $string

IFS=$space$tab$newline
cd emptydir
    string=" * * * \
             * * * "
    echo $string ${#string}
    echo "$string" "${#string}"    

আউটপুট

* * * * * * 30
 * * *                  * * *  30

ঠিক আছে, ঠিক আছে? ঠিক আছে, আসুন পরিবেশটি আবার পরিবর্তন করা যাক।

    touch file1 file2 file3 file4 file5
    echo $string ${#string}
    echo "$string" "${#string}"    

আউটপুট

file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 file1 file2 file3 file4 file5 30
 * * *                  * * *  30

ওহো।

ডিফল্টরূপে শেল ফাইলের নাম গ্লোবগুলি প্রসারিত করতে পারে যদি সেগুলির সাথে এটি মেলে। এটি তার পার্স-অর্ডারে প্যারামিটার বিস্তৃতি এবং ফিল্ড-বিভক্ত হওয়ার পরে ঘটে এবং সুতরাং কোনও উদ্ধৃত স্ট্রিং এইভাবে ঝুঁকিপূর্ণ। আপনি set -fযদি চান তবে আপনি এই আচরণটি টগল করতে পারেন তবে কোনও পসিক্স-সামঞ্জস্যপূর্ণ শেল ডিফল্টরূপে সর্বদা গ্লোব করবে।

আপনি আপনার ইনডেন্টেশন পছন্দগুলি অনুসারে বিস্তৃতিতে উদ্ধৃতিগুলি ফেলে দিলে আপনি যে ধরণের জিনিসগুলির বিরুদ্ধে যাচ্ছেন তা এই is এবং তবুও, প্রতিটি ক্ষেত্রে, এর সম্প্রসারণ আচরণ নির্বিশেষে, এর জন্য আসল মান $stringসর্বদা এখনও যখনই আপনি এটিকে নির্ধারিত করেছিলেন তখনই থাকে is সুতরাং প্রথম জিনিস ফিরে আসা যাক।

set -- 'Arg 1: Line 1.' \
       'Arg 2: Line 2.' \
       'and so on for'  \
       'as long as you might like.'
var="$*"
echo "$var" "${#var}"

আউটপুট

Arg 1: Line 1. Arg 2: Line 2. and so on for as long as you might like. 70

আমি বিশ্বাস করি এটি আপনার ইনডেন্টেশন পছন্দগুলিতে শেল সিনট্যাক্সটিকে অভিযোজিত করার একটি সুদূরতর উপায়। আমি উপরে যা করছি তা প্রতিটি পৃথক স্ট্রিংকে পজিশনাল প্যারামিটারে অর্পণ করা হয় - যা প্রতিটি যেমন $1বা ${33}- এর মতো সংখ্যার দ্বারা উল্লেখ করা যেতে পারে এবং তারপরে $varবিশেষ শেল প্যারামিটারটি ব্যবহার করে তাদের সংক্ষিপ্ত মানগুলি নির্ধারণ করে $*

এই পদ্ধতির $IFSপক্ষেও অনাক্রম্য নয় । তবুও, আমি এর সম্পর্কটিকে $IFSএই ক্ষেত্রে একটি অতিরিক্ত বেনিফিট হিসাবে বিবেচনা করি। বিবেচনা:

IFS=\ ;space_split="$*"
IFS=/; slash_split="$*";IFS='
';new_line_split="$*"

echo "$space_split"
echo "$slash_split"
echo "$new_line_split"

আউটপুট

Arg 1: Line 1. Arg 2: Line 2. and so on for as long as you might like.
Arg 1: Line 1./Arg 2: Line 2./and so on for/as long as you might like.
Arg 1: Line 1.
Arg 2: Line 2.
and so on for
as long as you might like.

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

IFS=;delimitless="$*"
echo "$delimitless" "${#delimitless}"

আউটপুট

Arg 1: Line 1.Arg 2: Line 2.and so on foras long as you might like. 67


2

একটি ব্যাশ সাবস্টিটিউশন এক্সপেনশন ব্যবহার করুন

আপনি যদি ব্যাশ ব্যবহার করছেন তবে আপনি একটি বিকল্প সম্প্রসারণ ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

$ echo "${VAR//  /}"
This displays with extra spaces.

1

পথের মতো ভেরিয়েবল সেট করার জন্য এটি একটি বৈকল্পিক:

set -- "${MYDIR}/usr/local/lib" \
      :"${MYDIR}/usr/lib" \
      :"${MYDIR}/lib" \
       "${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
    export LD_LIBRARY_PATH="$*"
    LD_LIBRARY_PATH=$(sed 's/ :/:/g' <<< $LD_LIBRARY_PATH)

setওভাররাইট ব্যবহার করে $@, যা সংরক্ষণ এবং পরে নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:

ARGV=("$@")
exec foo "${ARGV[@]}"

LD_LIBRARY_PATH=$(sed 's/ :/:/g' <<< $LD_LIBRARY_PATH)লাইন কোলন সেইসাথে সম্ভব trailing হোয়াইটস্পেস আগে স্পেস ঘটিয়েছে। যদি কেবল স্থানের স্থানগুলি অপসারণ করে তবে LD_LIBRARY_PATH=${LD_LIBRARY_PATH%% }পরিবর্তে ব্যবহার করুন।

এই সম্পূর্ণ পদ্ধতির মাইক্রজারের দুর্দান্ত উত্তরের একটি বৈকল্পিক।


0

হোয়াইটস্পেস অক্ষরগুলি থেকে ভয় পাবেন না। আপনি আপনার মাল্টলাইন পাঠ্য প্রিন্ট করার আগে এগুলি সরিয়ে দিন

$ cat ./t.sh
#!/bin/bash

NEED_HELP=1
if [[ $NEED_HELP -eq 1 ]]; then

    lucky_number=$((1 + RANDOM % 10 + 10))

    read -r -d '' text <<'    EOF'
    NAME says hello

    Look at this helpful text:

                                                 * -**
                                 Eyjafjallajokull        Eyjafjallajokull
                            Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
                        Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
                    Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
                Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
            Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
        Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
    Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull

    Don't go away, please rate your experience... It'll just take two minutes.

    EOF
    text=$(echo "$text" | sed -r 's!^\s{4}!!')
    text=$(echo "$text" | sed -r "s!\bNAME\b!$0!") # Bash: text=${text//NAME/$0}
    text=$(echo "$text" | sed -r "s!\btwo\b!$lucky_number!")

    echo "$text"

fi

আউটপুট:

$ ./t.sh
./t.sh says hello

Look at this helpful text:

                                             * -**
                             Eyjafjallajokull        Eyjafjallajokull
                        Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
                    Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
                Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
            Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
        Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
    Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull
Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull Eyjafjallajokull

Don't go away, please rate your experience... It'll just take 16 minutes.

একটি <<-হেরডোক ব্যবহার করার প্রয়োজন নেই এবং ট্যাব অক্ষরের সাথে আপনার 4-স্পেস ইন্ডেন্টেশনটি ভেঙে ফেলুন।

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