বাশ ধারাবাহিকতা লাইন


158

আপনি কীভাবে বাশ ধারাবাহিকতা লাইন ব্যবহার করবেন?

আমি বুঝতে পারি যে আপনি এটি করতে পারেন:

echo "continuation \
lines"
>continuation lines

তবে, আপনার যদি ইনডেন্ট কোড থাকে তবে এটি এত ভাল কাজ করে না:

    echo "continuation \
    lines"
>continuation     lines

5
গুগলের বাশ শেল স্টাইল গাইড "আপনি যদি 80 টির চেয়ে বেশি অক্ষরের স্ট্রিং লিখতে হয়" এর জন্য "এখানে" নথির সুপারিশ করেন । দেখুন @ tripleee এর উত্তর
ট্রেভর বয়ড স্মিথ

google.github.io/styleguide/… - এটি নতুন নথির সরাসরি লিঙ্ক
জ্যাকলাম

উত্তর:


161

এটি আপনি চান হতে পারে

$       echo "continuation"\
>       "lines"
continuation lines

যদি এটি প্রতিধ্বনিত করতে দুটি আর্গুমেন্ট তৈরি করে এবং আপনি কেবল একটি চান, তবে আসুন স্ট্রিং কনকেন্টেশনটি দেখুন। ব্যাশে, একে অপরের পাশে দুটি স্ট্রিং রেখেছি:

$ echo "continuation""lines"
continuationlines

সুতরাং একটি ইন্টেন্ট ছাড়াই একটি ধারাবাহিকতা লাইন একটি স্ট্রিং ব্রেক করার এক উপায়:

$ echo "continuation"\
> "lines"
continuationlines

তবে যখন কোনও ইনডেন্ট ব্যবহার করা হয়:

$       echo "continuation"\
>       "lines"
continuation lines

আপনি দুটি আর্গুমেন্ট পান কারণ এটি আর কোনও যুক্তি নয়।

আপনি যদি একটি একক স্ট্রিং চান যা লাইনগুলি অতিক্রম করে, যখন ইনডেন্টিং করার সময় কিন্তু সমস্ত স্থানগুলি না পেয়ে থাকে তবে আপনি যে পদ্ধতির চেষ্টা করতে পারেন তা হল ধারাবাহিকতা রেখাটি খনন করা এবং ভেরিয়েবলগুলি ব্যবহার করা:

$ a="continuation"
$ b="lines"
$ echo $a$b
continuationlines

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


1
আপনার সহায়তার জন্য ধন্যবাদ, তবে এটি স্পেসগুলি সরিয়ে দিলে, তারা এখন পৃথক পরামিতি (বাশ দ্বিতীয় পংক্তির স্পেসগুলি প্যারামিটার বিভাজক হিসাবে ব্যাখ্যা করছে) এবং এখন কেবল ইকো কমান্ডের কারণে সঠিকভাবে মুদ্রিত হয়েছে।

1
ওহ, আপনি স্প্যানলাইনগুলির জন্য একটি একক (বাশ) স্ট্রিং চান! আমি এখন দেখি.
রায় তোয়াল

4
একটি পরিবর্তনশীল সহ সমাধান:s="string no. 1" s+="string no. 2" s+=" string no. 3" echo "$s"
জনি থান্ডারম্যান

30

এখানে <<-HEREটার্মিনেটর সহ নথিগুলি ইনডেন্টড মাল্টি-লাইন পাঠ্য স্ট্রিংয়ের জন্য ভাল কাজ করে। এটি এখানে নথি থেকে যে কোনও শীর্ষস্থানীয় ট্যাব সরিয়ে ফেলবে। (যদিও লাইন টার্মিনেটরগুলি এখনও থাকবে))

cat <<-____HERE
    continuation
    lines
____HERE

Http://ss64.com/bash/syntax-here.html এও দেখুন

আপনার যদি কিছু সংরক্ষণ করতে হয় তবে সমস্ত নয়, শীর্ষস্থানীয় হোয়াইটস্পেস, আপনার মতো কিছু ব্যবহার করা যেতে পারে

sed 's/^  //' <<____HERE
    This has four leading spaces.
    Two of them will be removed by sed.
____HERE

অথবা trনিউলাইনগুলি থেকে মুক্তি পেতে ব্যবহার করুন :

tr -d '\012' <<-____
    continuation
     lines
____

(দ্বিতীয় লাইনে একটি ট্যাব এবং সামনে একটি স্পেস উপরে রয়েছে; হ্যাডোডোক টার্মিনেটরের আগে ট্যাব ড্যাশ অপারেটর দ্বারা সরানো হবে, যেখানে স্থানটি সংরক্ষণ করা হবে))

অনেকগুলি লাইনে দীর্ঘ জটিল স্ট্রিং মোড়ানোর জন্য, আমি পছন্দ করি printf:

printf '%s' \
    "This will all be printed on a " \
    "single line (because the format string " \
    "doesn't specify any newline)"

এটি প্রাসঙ্গিক ক্ষেত্রেও ভাল কাজ করে যেখানে আপনি অন্য ভাষায় শেল স্ক্রিপ্টের অযৌক্তিক টুকরো এম্বেড করতে চান যেখানে হোস্ট ভাষার সিনট্যাক্স আপনাকে এখানে কোনও নথি ব্যবহার করতে দেয় না, যেমন একটি Makefileবা Dockerfile

printf '%s\n' >./myscript \
    '#!/bin/sh` \
    "echo \"G'day, World\"" \
    'date +%F\ %T' && \
chmod a+x ./myscript && \
./myscript

আমার জন্য কাজ করে না। উবুন্টু 16.04। আমি প্রত্যাশিত সংক্ষিপ্ত এক লাইনের পরিবর্তে দুটি লাইন পেয়েছি।
পেঙ্গে জেং 15

@ পেঙ্গেজেং প্রকৃতপক্ষে, এটি ইনডেন্টেশন থেকে মুক্তি পাওয়ার সমস্যা সমাধান করে, একসাথে লাইনে যোগদানের এক নয়। আপনি এখনও দুটি লাইনে একসাথে যোগদানের জন্য একটি লাইনের শেষে নতুন লাইনটি ব্যাকস্ল্যাশ করতে পারেন।
ট্রিপলি

(তবে printfএখনই প্রথম উদাহরণটি দেখুন ))
আগস্ট'১৯:৩৩ এ ট্রিপলি

12

আপনি ব্যাশ অ্যারে ব্যবহার করতে পারেন

$ str_array=("continuation"
             "lines")

তারপর

$ echo "${str_array[*]}"
continuation lines

একটি অতিরিক্ত স্থান রয়েছে, কারণ (ব্যাশ ম্যানুয়াল পরে):

যদি শব্দটি ডাবল-কোট করা ${name[*]}হয় তবে প্রতিটি অ্যারে সদস্যের মান আইএফএস ভেরিয়েবলের প্রথম অক্ষর দ্বারা পৃথক করে একটি শব্দে প্রসারিত হয়

সুতরাং IFS=''অতিরিক্ত স্থান থেকে মুক্তি পেতে সেট করুন

$ IFS=''
$ echo "${str_array[*]}"
continuationlines

4

নির্দিষ্ট পরিস্থিতিতে বাশের উপসংহার ক্ষমতাটি যথাযথ হতে পারে util

উদাহরণ:

temp='this string is very long '
temp+='so I will separate it onto multiple lines'
echo $temp
this string is very long so I will separate it onto multiple lines

ব্যাশ ম্যান পৃষ্ঠার PARAMETERS বিভাগ থেকে:

নাম = [মান] ...

... যে ক্ষেত্রে একটি অ্যাসাইনমেন্ট স্টেটমেন্ট শেল ভেরিয়েবল বা অ্যারে সূচককে একটি মান নির্ধারণ করছে, সেই প্রসঙ্গে, + = অপারেটরটি ভেরিয়েবলের আগের মানটিতে সংযোজন বা যুক্ত করতে ব্যবহৃত হতে পারে। যখন + = কোনও চলকটিতে প্রয়োগ করা হয় যার জন্য পূর্ণসংখ্যা বৈশিষ্ট্য নির্ধারণ করা হয়েছে, মানটি একটি গাণিতিক এক্সপ্রেশন হিসাবে মূল্যায়ন করা হয় এবং ভেরিয়েবলের বর্তমান মানতে যুক্ত হয় যা মূল্যায়নও হয়। যৌগিক অ্যাসাইনমেন্ট ব্যবহার করে অ্যারে ভেরিয়েবলে যখন + = প্রয়োগ করা হয় (নীচে অ্যারেগুলি দেখুন) তখন ভেরিয়েবলের মানটি সেট না করা হয় (যেমন = ব্যবহার করার সময় হয়) এবং অ্যারের সর্বাধিক সূচকের চেয়ে আরও একটিতে নতুন মান যুক্ত হয় (ইনডেক্সড অ্যারেগুলির জন্য) বা কোনও এসোসিয়েটিভ অ্যারেতে অতিরিক্ত কী-মান জোড়া হিসাবে যুক্ত করা হয়। যখন স্ট্রিং-ভ্যালু ভেরিয়েবলে প্রয়োগ করা হয় তখন মানটি প্রসারিত হয় এবং ভেরিয়েবলের মানতে যুক্ত হয়।


সম্ভবত এই পৃষ্ঠায় সেরা পরামর্শ। একটি হেরডোক ব্যবহার করে এবং <সিআর> এস এর অনুবাদে পাইপিং সুপার অনিচ্ছুক এবং ব্যর্থ হয় যখন স্ট্রিংটিকে প্রকৃতপক্ষে বিচ্ছিন্নভাবে লাইন বিভাজক স্থাপন করা দরকার।

2

কমান্ড আর্গুমেন্টের অংশ হিসাবে আমাকে একটি দীর্ঘ বার্তা পাঠাতে হয়েছিল এবং লাইন দৈর্ঘ্যের সীমাবদ্ধতা মেনে চলতে হয়েছিল এমন পরিস্থিতিতে আমি এসে পৌঁছেছি। কমান্ডগুলি দেখতে এরকম কিছু দেখাচ্ছে:

somecommand --message="I am a long message" args

আমি যেভাবে সমাধান করেছি তা হ'ল বার্তাটি এখানে দলিল হিসাবে সরিয়ে নেওয়া (যেমন @ ট্রিপলির পরামর্শ দেওয়া হয়েছে)। তবে এখানে একটি নথী স্টিনে পরিণত হয়, সুতরাং এটি আবার পড়তে হবে, আমি নীচের পদ্ধতির সাথে চলেছি:

message=$(
    tr "\n" " " <<- END
        This is a
        long message
END
)
somecommand --message="$message" args

এতে সুবিধা রয়েছে যা $messageকোনও অতিরিক্ত সাদা স্থান বা লাইন ব্রেক ছাড়াই স্ট্রিং ধ্রুবক হিসাবে ঠিক ব্যবহার করা যেতে পারে।

নোট করুন যে উপরের প্রকৃত বার্তা লাইনগুলি tabপ্রতিটি অক্ষরের সাথে উপসর্গযুক্ত , যা এখানে নথিতে নিজেই ছাঁটা হয়েছে (ব্যবহারের কারণে <<-)। এখনও শেষে লাইন বিরতি আছে, যা পরে ddস্পেস দিয়ে প্রতিস্থাপিত হয় ।

আরও মনে রাখবেন যে আপনি যদি নতুন লাইনগুলি সরিয়ে না রাখেন "$message"তবে প্রসারিত হওয়ার সাথে সাথে সেগুলি উপস্থিত হবে । কিছু ক্ষেত্রে, আপনি আশেপাশের ডাবল-কোটগুলি সরিয়ে কাজটি করতে সক্ষম হতে পারেন $message, তবে বার্তাটি আর একক তর্ক হতে পারে না।


2

লাইন ধারাবাহিকতা সিনট্যাক্সের চতুর ব্যবহারের মাধ্যমেও অর্জন করা যায়।

এর ক্ষেত্রে echo:

# echo '-n' flag prevents trailing <CR> 
echo -n "This is my one-line statement" ;
echo -n " that I would like to make."
This is my one-line statement that I would like to make.

যুদ্ধের ক্ষেত্রে:

outp="This is my one-line statement" ; 
outp+=" that I would like to make." ; 
echo -n "${outp}"
This is my one-line statement that I would like to make.

যুদ্ধের ক্ষেত্রে আরেকটি পদ্ধতি:

outp="This is my one-line statement" ; 
outp="${outp} that I would like to make." ; 
echo -n "${outp}"
This is my one-line statement that I would like to make.

ভাল খবর!


1

নীচের অনুসারে ইন্ডেন্টেশনের মধ্যে প্রয়োজনীয় হিসাবে আপনি কেবল নিউলাইনগুলি (ব্যাকস্ল্যাশ ব্যবহার না করে) এর সাথে পৃথক করতে পারেন এবং কেবল নতুন লাইনের স্ট্রিপ।

উদাহরণ:

echo "continuation
of 
lines" | tr '\n' ' '

অথবা এটি যদি একটি পরিবর্তনীয় সংজ্ঞা হয় তবে নতুন লাইনগুলি স্বয়ংক্রিয়ভাবে স্পেসে রূপান্তরিত হয়। সুতরাং, অতিরিক্ত স্পেসগুলির স্ট্রিপ কেবল প্রযোজ্য হলে।

x="continuation
of multiple
lines"
y="red|blue|
green|yellow"

echo $x # This will do as the converted space actually is meaningful
echo $y | tr -d ' ' # Stripping of space may be preferable in this case

1

এটি ব্যবহারকারী যা চেয়েছিলেন ঠিক তা নয়, একাধিক লাইনের বিস্তৃত দীর্ঘতর স্ট্রিং তৈরির অন্য উপায়টি এটি ক্রমবর্ধমানভাবে তৈরি করা, যেমন:

$ greeting="Hello"
$ greeting="$greeting, World"
$ echo $greeting
Hello, World

স্পষ্টতই এক্ষেত্রে এটি আরও একবার তৈরি করা সহজ হত, তবে দীর্ঘতর স্ট্রিংয়ের সাথে ডিল করার সময় এই স্টাইলটি খুব হালকা ও বোধগম্য হতে পারে।


0

তবে, আপনার যদি ইনডেন্ট কোড থাকে তবে এটি এত ভাল কাজ করে না:

    echo "continuation \
    lines"
>continuation     lines

একক উদ্ধৃতি দিয়ে চেষ্টা করুন এবং স্ট্রিংগুলিকে একত্রিত করুন:

    echo 'continuation' \
    'lines'
>continuation lines

দ্রষ্টব্য: উপসংহারে একটি সাদা স্থান অন্তর্ভুক্ত রয়েছে।


2
এটি প্রতিধ্বনি এবং স্ট্রিং আর্গুমেন্টের সাথে কাজ করে তবে ভেরিয়েবল অ্যাসাইনমেন্টের মতো এটি অন্যান্য জিনিসগুলির সাথে কাজ করে না। যদিও প্রশ্নটি ভেরিয়েবল সম্পর্কে নয়, প্রতিধ্বনি ব্যবহার করা কেবল উদাহরণ ছিল। পরিবর্তে echo আপনার যদি ছিল x=, আপনি ত্রুটি পেতে চাই : lines: command not found.
এলএস

0

আপনি কোন ধরণের ঝুঁকি গ্রহণ করবেন এবং ডেটা আপনি কতটা ভাল জানেন এবং বিশ্বাস করবেন তার উপর নির্ভর করে আপনি সরলিকাল ভেরিয়েবল ইন্টারপোলেশন ব্যবহার করতে পারেন।

$: x="
    this
    is
       variably indented
    stuff
   "
$: echo "$x" # preserves the newlines and spacing

    this
    is
       variably indented
    stuff

$: echo $x # no quotes, stacks it "neatly" with minimal spacing
this is variably indented stuff

-2

এটি সম্ভবত আপনার প্রশ্নের উত্তর দেয় না তবে আপনি এটি যেভাবেই সম্ভবত দরকারী হতে পারেন।

প্রথম কমান্ড স্ক্রিপ্ট তৈরি করে যা দ্বিতীয় কমান্ড দ্বারা প্রদর্শিত হয়।

তৃতীয় কমান্ড সেই স্ক্রিপ্টটি কার্যকর করতে সক্ষম করে।

চতুর্থ কমান্ড একটি ব্যবহারের উদাহরণ দেয়।

john@malkovich:~/tmp/so$ echo $'#!/usr/bin/env python\nimport textwrap, sys\n\ndef bash_dedent(text):\n    """Dedent all but the first line in the passed `text`."""\n    try:\n        first, rest = text.split("\\n", 1)\n        return "\\n".join([first, textwrap.dedent(rest)])\n    except ValueError:\n        return text  # single-line string\n\nprint bash_dedent(sys.argv[1])'  > bash_dedent
john@malkovich:~/tmp/so$ cat bash_dedent 
#!/usr/bin/env python
import textwrap, sys

def bash_dedent(text):
    """Dedent all but the first line in the passed `text`."""
    try:
        first, rest = text.split("\n", 1)
        return "\n".join([first, textwrap.dedent(rest)])
    except ValueError:
        return text  # single-line string

print bash_dedent(sys.argv[1])
john@malkovich:~/tmp/so$ chmod a+x bash_dedent
john@malkovich:~/tmp/so$ echo "$(./bash_dedent "first line
>     second line
>     third line")"
first line
second line
third line

মনে রাখবেন যে আপনি যদি এই স্ক্রিপ্টটি সত্যই ব্যবহার করতে চান তবে এক্সিকিউটেবল স্ক্রিপ্টটিকে ~/binএমনভাবে স্থানান্তরিত করা আরও বেশি অর্থবোধ করে যাতে এটি আপনার পথে চলে।

কীভাবে textwrap.dedentকাজ করে তার বিশদগুলির জন্য পাইথন রেফারেন্সটি দেখুন ।

যদি ব্যবহার $'...'বা "$(...)"আপনাকে বিভ্রান্ত করে তোলে তবে ইতিমধ্যে একটি প্রশ্ন না থাকলে অন্য একটি প্রশ্ন (প্রতি নির্মাণে একটি) জিজ্ঞাসা করুন। আপনি যে প্রশ্নের সন্ধান করছেন / জিজ্ঞাসা করেছেন তার লিঙ্ক সরবরাহ করা ভাল হতে পারে যাতে অন্য লোকের লিঙ্কযুক্ত রেফারেন্স থাকে।


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