বাশ স্ক্রিপ্টে ভেরিয়েবলগুলিতে কীভাবে নিউলাইনগুলি যুক্ত করবেন


64

যখন আমি করি

str="Hello World\n===========\n"

আমিও \nমুদ্রিত আউট। আমি কিভাবে নতুন লাইনে থাকতে পারি?


1
যদিও এখানে উত্তরগুলি দুর্দান্ত, বাস্তবে আমি মনে করি আপনি বেশিরভাগ সময় এই ধরণের জিনিসটির জন্য কোনও অ্যারে ব্যবহার করা ভাল।
অরিসপপ

উত্তর:


73

ইন bashআপনি বাক্য গঠন ব্যবহার করতে পারেন

str=$'Hello World\n===========\n'

এর পূর্বে সিঙ্গেল কোটগুলি $একটি নতুন সিনট্যাক্স যা স্ট্রিংগুলিতে এস্কেপ সিকোয়েন্সগুলি সন্নিবেশ করতে দেয়।

এছাড়াও printfবিল্টিন ফলস্বরূপ ফলাফলকে আউটপুট সংরক্ষণ করতে দেয় to

printf -v str 'Hello World\n===========\n'

উভয় সমাধানের জন্য একটি সাব-শেল প্রয়োজন হয় না।

নিম্নলিখিতটিতে যদি আপনার স্ট্রিং মুদ্রণের প্রয়োজন হয়, আপনার নীচের উদাহরণের মতো ডাবল উদ্ধৃতি ব্যবহার করা উচিত:

echo "$str"

কারণ আপনি যখন কোট ছাড়াই স্ট্রিং প্রিন্ট করবেন তখন নিউলাইনটি স্পেসে রূপান্তরিত হবে।


1
সিনট্যাক্স কাকে str=$'Hello World\n===========\n'বলে? পরিবর্তনশীল বিকল্প?
zengr

5
@zengr: এটা বলা হচ্ছে ANSI-সি উদ্ধৃত , এবং এটা সমর্থিত হচ্ছে zshএবং ksh; তবে এটি পসিক্স-কমপ্লায়েন্ট নয়।
mklement0

4
@ মেক্লেমেন্ট ০, এটি ksh93 থেকে এসেছে, এটি zsh, বাশ, মোক এবং ফ্রিবিএসডি এস দ্বারা সমর্থিত এবং পসিক্সের পরবর্তী বড় সংশোধনীতে এর অন্তর্ভুক্তিটি আলোচনা চলছে
স্টাফেন চ্যাজেলাস

1
ডাবল উদ্ধৃতি দিয়ে কাজ করছে বলে মনে হচ্ছে না? যেমন str=$"My $PET eats:\n$PET food"? এই পদ্ধতিটি ডাবল উক্তিগুলির জন্য কাজ করে
ব্র্যাড পার্কস

31

আপনি একক উদ্ধৃতিগুলির মধ্যে আক্ষরিক নিউলাইনগুলি রাখতে পারেন (যে কোনও বোর্ন / পসিক্স-স্টাইল শেলটিতে)।

str='Hello World
===========
'

একাধিক স্ট্রিংয়ের জন্য, এখানে নথিগুলি প্রায়শই সুবিধাজনক। স্ট্রিংটি একটি কমান্ডের ইনপুট হিসাবে খাওয়ানো হয়।

mycommand <<'EOF'
Hello World
===========
EOF

আপনি যদি কোনও ভেরিয়েবলে স্ট্রিংটি সঞ্চয় করতে চান তবে catকমান্ড প্রতিস্থাপনে কমান্ডটি ব্যবহার করুন । স্ট্রিংয়ের শেষে থাকা নতুন লাইন অক্ষর (গুলি) কমান্ড প্রতিস্থাপনের দ্বারা ছিনিয়ে নেওয়া হবে। আপনি যদি চূড়ান্ত নিউলাইনগুলি ধরে রাখতে চান তবে শেষে একটি স্টপার রেখে দিন এবং পরে এটি সরিয়ে দিন। পসিক্স-কমপ্লায়েন্ট শেলগুলিতে, আপনি str=$(cat <<'EOF'); str=${str%a}হেরডোক যথাযথ অনুসারে লিখতে পারেন , তবে বাশের জন্য হেরেডোকটি বন্ধ হয়ে যাওয়া বন্ধনীটির আগে উপস্থিত হওয়া প্রয়োজন।

str=$(cat <<'EOF'
Hello World
===========
a
EOF
); str=${str%a}

Ksh, bash এবং zsh এ, আপনি $'…'উদ্ধৃতিগুলির মধ্যে ব্যাকস্ল্যাশ পলায়নের প্রসারিত করতে উদ্ধৃত ফর্মটি ব্যবহার করতে পারেন ।

str=$'Hello World\n===========\n'

1
আমি জিএনইউ ব্যাশ ৪.১.৫ ব্যবহার করছি, এবং str=$(cat <<'EOF')ঠিক তেমনভাবে কাজ করে না .. )ডক-এর শেষের পরে পরবর্তী লাইনে স্থাপন করা দরকার EOF.. তবে তবুও, এটি কমান্ডের কারণে পিছনে থাকা নতুন লাইনটি হারিয়ে ফেলে উপকল্পন।
পিটার.ও

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

দুর্দান্ত জিনিস; ভেরিয়েবল-এ এখানে কোনও ডক ক্যাপচার করার সময় অনুসরণযোগ্য (এবং শীর্ষস্থানীয়) \nউদাহরণগুলি সংরক্ষণ করার জন্য, স্টপার পদ্ধতির বিকল্প হিসাবে bashবিবেচনা করুন IFS= read -r -d '' str <<'EOF'...(আমার উত্তর দেখুন)।
mklement0

8

আপনি কি "প্রতিধ্বনি" ব্যবহার করছেন? "ইকো-ই" চেষ্টা করুন।

echo -e "Hello World\n===========\n"

2
BTW। আপনার চূড়ান্ত need n দরকার নেই, কারণ echoআপনি -n নির্দিষ্ট না করে স্বয়ংক্রিয়ভাবে একটি যুক্ত হবে। (তবে, প্রশ্নের মূল অবতারণা হল কীভাবে এই নতুনলাইনগুলিকে ভেরিয়েবলে আনা যায়)।
পিটার.ও

+1 সমস্ত সমাধানগুলির মধ্যে, এটি একটি সর্বাধিক প্রত্যক্ষ এবং সহজ।
হাই ভু

প্রতিধ্বনি-ওএস এক্স-তে কাজ করে না
গ্রেগ এম। ক্রসাক

2
@GregKrsak: ইন bash, echo -e আছে OS X এর উপর কাজ - কারণ যে echoএকটি ব্যাশ হয় builtin (বদলে একটি বহিস্থিত এক্সিকিউটেবল) এবং যে builtin সমর্থন করে -e। (ক builtin, এটা কাজ করা উচিত সব প্ল্যাটফর্মের যে ব্যাশ উপর সঞ্চালিত হয়; ঘটনাক্রমে, echo -eকাজ করে kshএবং zshখুব)। বিপরীতে, তবে, ওএস এক্স - এর বাইরের echoইউটিলিটি/bin/echo - সত্যই সমর্থন করে না-e
mklement0

3

আপনার স্ক্রিপ্টে যদি আপনাকে অনেকবার নিউলাইনগুলির প্রয়োজন হয় তবে আপনি একটি নতুন লাইন ধারণ করে একটি বৈশ্বিক পরিবর্তনশীল ঘোষণা করতে পারেন। এইভাবে আপনি এটি ডাবল-কোটেড স্ট্রিংগুলিতে (পরিবর্তনশীল বিস্তৃতি) ব্যবহার করতে পারেন।

NL=$'\n'
str="Hello World${NL} and here is a variable $PATH ===========${NL}"

কেন $''একটি সাবশেল দরকার?
মাদুর

দুঃখিত, আমি একটি উত্তর ভুল পড়েছি।
pihentagy

আমি কি ডাউনটা লোকদের কাছ থেকে ব্যাখ্যা চাইতে পারি?
পাইহন্তেজি

নিস! এটি ডাবল উদ্ধৃতিগুলি ব্যবহার করে চলকগুলিতে অন্তর্ভুক্ত করা যেতে পারে, যেমন"My dog eats:${NL}dog food"
ব্র্যাড পার্ক

3

সমস্ত আলোচনা থেকে, এখানে আমার জন্য সহজ উপায়:

bash$ str="Hello World
==========="
bash$ echo "$str"
Hello World
===========

প্রতিধ্বনি কমান্ড ব্যবহার করা আবশ্যক উদ্ধৃতি চিহ্ন


3

দুর্দান্ত বিদ্যমান উত্তরগুলির পরিপূরক করতে:

আপনি ব্যবহার করেন, তাহলে bashএবং আপনার পছন্দ পাঠযোগ্যতা জন্য প্রকৃত নতুন লাইন ব্যবহার , readজন্য অন্য বিকল্প একটি পরিবর্তনশীল একটি এখানে-ডক ক্যাপচার , যা (অন্যান্য সমাধান এখানকার মত) একটি subshell ব্যবহার প্রয়োজন হয় না।

# Reads a here-doc, trimming leading and trailing whitespace.
# Use `IFS= read ...` to preserve it (the trailing \n, here).
read -r -d '' str <<'EOF'   # Use `IFS= read ...` to preserve the trailing \n
Hello World
===========
EOF
# Test: output the variable enclosed in "[...]", to show the value's boundaries.
$ echo "$str"
[Hello World
===========]
  • -rনিশ্চিত করে যে readইনপুটটি ব্যাখ্যা করে না (ডিফল্টরূপে, এটি ব্যাকস্ল্যাশগুলি বিশেষভাবে বিবেচনা করবে, তবে এটি খুব কমই প্রয়োজন হয়)।

  • -d ''"রেকর্ড" ডিলিমিটারকে একটি খালি স্ট্রিংয়ে সেট করে, পুরো ইনপুটটি একবারে readপড়ার কারণ (কেবলমাত্র একটি একক লাইনের পরিবর্তে)।

নোট করুন $IFS(ডিফল্টে (অভ্যন্তরীণ ক্ষেত্র বিভাজক)) রেখে যাওয়া ( $' \t\n'একটি স্থান, একটি ট্যাব, একটি নতুন লাইন), যে কোনও শীর্ষস্থানীয় এবং অনুসরণকারী শ্বেত স্থানটি নির্ধারিত মান থেকে ছাঁটা হয় $str, যার সাথে এখানে-ডকটির ট্রেলিং নতুনলাইন অন্তর্ভুক্ত থাকে।
(উল্লেখ্য যে, যদিও এখানে-ডক লাশ লাইনে শুরু হয় পরে শুরু বিভেদক ( 'EOF'এখানে), এটা নেই না একটি ধারণ নেতৃস্থানীয় সম্পর্কে newline)।

সাধারণত, এটি পছন্দসই আচরণ, তবে আপনি যদি এই ট্রেলিং করা নতুন লাইনটি চান তবে ন্যায়বিচারের IFS= read -r -d ''পরিবর্তে ব্যবহার করুন read -r -d ''তবে নোট করুন যে কোনও অগ্রণী এবং অনুসরণকারী শ্বেত স্পেস সংরক্ষণ করা হয়েছে।
(দ্রষ্টব্য যে IFS= সরাসরি readকমান্ডে প্রিপেন্ডিংয়ের অর্থ অ্যাসাইনমেন্টটি কেবলমাত্র সেই আদেশের সময় কার্যকর হয়, সুতরাং পূর্ববর্তী মানটি পুনরুদ্ধার করার দরকার নেই))


একটি এখানে-ডক ব্যবহার করে আপনাকে পাঠ্যতার জন্য মাল্টলাইন স্ট্রিংটি সেট করতে allyচ্ছিকভাবে ইনডেন্টেশন ব্যবহার করতে দেয় :

# Caveat: indentation must be actual *tab* characters - spaces won't work.
read -r -d '' str <<-'EOF' # NOTE: Only works if the indentation uses actual tab (\t) chars.
    Hello World
    ===========
EOF
# Output the variable enclosed in "[...]", to show the value's boundaries.
# Note how the leading tabs were stripped.
$ echo "$str"
[Hello World
===========]

স্থাপন -মধ্যে <<এবং এখানে-ডক খোলার বিভেদক ( 'EOF', এখানে) নেতৃস্থানীয় ট্যাব অক্ষর এখানে-ডক শরীর এবং এমনকি বন্ধের বিভেদক থেকে ছিনতাই করা সৃষ্টি করে কিন্তু মনে রাখবেন যে এই না শুধুমাত্র সঙ্গে কাজ করে প্রকৃত ট্যাব অক্ষর , স্পেস না, তাই যদি আপনার সম্পাদক ফাঁকা জায়গায় ট্যাব কী-টিপস অনুবাদ করে, অতিরিক্ত কাজ করা প্রয়োজন।


-1

আপনার এটি এইভাবে করা দরকার:

STR=$(echo -ne "Hello World\n===========\n")

হালনাগাদ:

ফ্রেড যেমন উল্লেখ করেছেন, এভাবে আপনি "\ n" অনুসরণ করবেন tra ব্যাকস্ল্যাশ ক্রম প্রসারিত সহ ভেরিয়েবল বরাদ্দ করতে, করুন:

STR=$'Hello World\n===========\n\n'

আসুন এটি পরীক্ষা করি:

echo "[[$STR]]"

আমাদের এখন দেয়:

[[Hello World
===========

]]

দ্রষ্টব্য, যে $ '"$" "এর চেয়ে পৃথক। দ্বিতীয়টি বর্তমান লোকেল অনুসারে অনুবাদ করে। ডিজিটালের জন্য কোয়েটিং বিভাগটি দেখুন man bash


-2
#!/bin/bash

result=""

foo="FOO"
bar="BAR"

result+=$(printf '%s' "$foo")$'\n'
result+=$(printf '%s' "$bar")$'\n'

echo "$result"
printf '%s' "$result"

আউটপুট:

FOO
BAR

FOO
BAR

1
কেন সহজভাবে নয় result+=$foo$'\n'? যদি কোনও $(printf %s "$foo")হয় $fooতবে ট্রেলিং করা নতুন লাইনের অক্ষরগুলি ছাঁটাবে ।
স্টাফেন চেজেলাস

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