যখন আমি করি
str="Hello World\n===========\n"
আমিও \n
মুদ্রিত আউট। আমি কিভাবে নতুন লাইনে থাকতে পারি?
যখন আমি করি
str="Hello World\n===========\n"
আমিও \n
মুদ্রিত আউট। আমি কিভাবে নতুন লাইনে থাকতে পারি?
উত্তর:
ইন bash
আপনি বাক্য গঠন ব্যবহার করতে পারেন
str=$'Hello World\n===========\n'
এর পূর্বে সিঙ্গেল কোটগুলি $
একটি নতুন সিনট্যাক্স যা স্ট্রিংগুলিতে এস্কেপ সিকোয়েন্সগুলি সন্নিবেশ করতে দেয়।
এছাড়াও printf
বিল্টিন ফলস্বরূপ ফলাফলকে আউটপুট সংরক্ষণ করতে দেয় to
printf -v str 'Hello World\n===========\n'
উভয় সমাধানের জন্য একটি সাব-শেল প্রয়োজন হয় না।
নিম্নলিখিতটিতে যদি আপনার স্ট্রিং মুদ্রণের প্রয়োজন হয়, আপনার নীচের উদাহরণের মতো ডাবল উদ্ধৃতি ব্যবহার করা উচিত:
echo "$str"
কারণ আপনি যখন কোট ছাড়াই স্ট্রিং প্রিন্ট করবেন তখন নিউলাইনটি স্পেসে রূপান্তরিত হবে।
str=$'Hello World\n===========\n'
বলে? পরিবর্তনশীল বিকল্প?
zsh
এবং ksh
; তবে এটি পসিক্স-কমপ্লায়েন্ট নয়।
str=$"My $PET eats:\n$PET food"
? এই পদ্ধতিটি ডাবল উক্তিগুলির জন্য কাজ করে
আপনি একক উদ্ধৃতিগুলির মধ্যে আক্ষরিক নিউলাইনগুলি রাখতে পারেন (যে কোনও বোর্ন / পসিক্স-স্টাইল শেলটিতে)।
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'
str=$(cat <<'EOF')
ঠিক তেমনভাবে কাজ করে না .. )
ডক-এর শেষের পরে পরবর্তী লাইনে স্থাপন করা দরকার EOF
.. তবে তবুও, এটি কমান্ডের কারণে পিছনে থাকা নতুন লাইনটি হারিয়ে ফেলে উপকল্পন।
\n
উদাহরণগুলি সংরক্ষণ করার জন্য, স্টপার পদ্ধতির বিকল্প হিসাবে bash
বিবেচনা করুন IFS= read -r -d '' str <<'EOF'...
(আমার উত্তর দেখুন)।
আপনি কি "প্রতিধ্বনি" ব্যবহার করছেন? "ইকো-ই" চেষ্টা করুন।
echo -e "Hello World\n===========\n"
echo
আপনি -n নির্দিষ্ট না করে স্বয়ংক্রিয়ভাবে একটি যুক্ত হবে। (তবে, প্রশ্নের মূল অবতারণা হল কীভাবে এই নতুনলাইনগুলিকে ভেরিয়েবলে আনা যায়)।
bash
, echo -e
আছে OS X এর উপর কাজ - কারণ যে echo
একটি ব্যাশ হয় builtin (বদলে একটি বহিস্থিত এক্সিকিউটেবল) এবং যে builtin সমর্থন করে -e
। (ক builtin, এটা কাজ করা উচিত সব প্ল্যাটফর্মের যে ব্যাশ উপর সঞ্চালিত হয়; ঘটনাক্রমে, echo -e
কাজ করে ksh
এবং zsh
খুব)। বিপরীতে, তবে, ওএস এক্স - এর বাইরের echo
ইউটিলিটি/bin/echo
- সত্যই সমর্থন করে না-e
।
আপনার স্ক্রিপ্টে যদি আপনাকে অনেকবার নিউলাইনগুলির প্রয়োজন হয় তবে আপনি একটি নতুন লাইন ধারণ করে একটি বৈশ্বিক পরিবর্তনশীল ঘোষণা করতে পারেন। এইভাবে আপনি এটি ডাবল-কোটেড স্ট্রিংগুলিতে (পরিবর্তনশীল বিস্তৃতি) ব্যবহার করতে পারেন।
NL=$'\n'
str="Hello World${NL} and here is a variable $PATH ===========${NL}"
$''
একটি সাবশেল দরকার?
"My dog eats:${NL}dog food"
দুর্দান্ত বিদ্যমান উত্তরগুলির পরিপূরক করতে:
আপনি ব্যবহার করেন, তাহলে 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'
, এখানে) নেতৃস্থানীয় ট্যাব অক্ষর এখানে-ডক শরীর এবং এমনকি বন্ধের বিভেদক থেকে ছিনতাই করা সৃষ্টি করে কিন্তু মনে রাখবেন যে এই না শুধুমাত্র সঙ্গে কাজ করে প্রকৃত ট্যাব অক্ষর , স্পেস না, তাই যদি আপনার সম্পাদক ফাঁকা জায়গায় ট্যাব কী-টিপস অনুবাদ করে, অতিরিক্ত কাজ করা প্রয়োজন।
আপনার এটি এইভাবে করা দরকার:
STR=$(echo -ne "Hello World\n===========\n")
হালনাগাদ:
ফ্রেড যেমন উল্লেখ করেছেন, এভাবে আপনি "\ n" অনুসরণ করবেন tra ব্যাকস্ল্যাশ ক্রম প্রসারিত সহ ভেরিয়েবল বরাদ্দ করতে, করুন:
STR=$'Hello World\n===========\n\n'
আসুন এটি পরীক্ষা করি:
echo "[[$STR]]"
আমাদের এখন দেয়:
[[Hello World
===========
]]
দ্রষ্টব্য, যে $ '"$" "এর চেয়ে পৃথক। দ্বিতীয়টি বর্তমান লোকেল অনুসারে অনুবাদ করে। ডিজিটালের জন্য কোয়েটিং বিভাগটি দেখুন man bash
।
#!/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
result+=$foo$'\n'
? যদি কোনও $(printf %s "$foo")
হয় $foo
তবে ট্রেলিং করা নতুন লাইনের অক্ষরগুলি ছাঁটাবে ।