বাশে স্ট্রিং ভেরিয়েবলকে কীভাবে সংযুক্ত করতে হয়


2765

পিএইচপি-তে, স্ট্রিংগুলি নিম্নরূপে একত্রিত হয়:

$foo = "Hello";
$foo .= " World";

এখানে, $foo"হ্যালো ওয়ার্ল্ড" হয়ে যায়।

বাশে এটি কীভাবে সম্পন্ন হয়?


5
foo="Hello" foo=$foo" World" echo $foo এটি বরং "#! / বিন / শ"
প্যারাসিশ

1
স্থান ছাড়া হ্যালোওয়ার্ল্ড চাইলে কী করবেন?
আদি

@ আদিfoo1="World" foo2="Hello" foo3="$foo1$foo2"
জিনকোড

স্পেসগুলি
ব্যাশে

উত্তর:


3762
foo="Hello"
foo="${foo} World"
echo "${foo}"
> Hello World

সাধারণভাবে দুটি ভেরিয়েবলকে একত্রিত করার জন্য আপনি এগুলি কেবল একের পর এক লিখতে পারেন:

a='Hello'
b='World'
c="${a} ${b}"
echo "${c}"
> Hello World

313
সম্ভবত $fooডাবল উদ্ধৃতি ভিতরে রাখার অভ্যাসে থাকা ভাল , সেই সময়ের জন্য যখন এটি সত্যিই গুরুত্বপূর্ণ।
ক্যাসাবেল

103
আমাদের সর্বদা এটি করতে শিখানো হয়েছে কারণ যখন প্রতিস্থাপন ঘটে তখন শেল দ্বারা ফাঁকা স্থানগুলি উপেক্ষা করা হবে, তবে ডাবল উদ্ধৃতি সর্বদা সেই স্থানগুলি রক্ষা করবে।
স্ট্রবেরি

62
আপনার প্রথম উদাহরণে কি কোনও জায়গা থাকতে হবে? এর মতো কিছু করা কি সম্ভব foo="$fooworld"? আমি অনুমান করা হবে ...
nonsensickle

341
@Nansensickle যে নামটির জন্য একটি ভেরিয়েবল খুঁজবে fooworld। যেমন বন্ধনী হিসাবে সম্পন্ন করা হয় foo="${foo}world"...
Diswigiguating

4
@ জেভিই৯৯৯ হ্যাঁ, এটিও কার্যকরভাবে কাজ করে, যদিও আমার মতে এটি কোডের স্পষ্টতার পক্ষে যথেষ্ট ভাল নয় ... তবে এটি কেবল আমার পছন্দ হতে পারে ... এটি করার পাশাপাশি আরও কয়েকটি উপায় রয়েছে - বিষয়টি হ'ল পরিবর্তনশীল নামটি অ-পরিবর্তনশীল-নাম অংশগুলি থেকে পৃথক করা হয়েছে তা নিশ্চিত করে যাতে এটি সঠিকভাবে পার্স হয়।
twalberg

1126

এই কোডটিতে +=প্রদর্শিত হিসাবে ব্যাশ অপারেটরকে সমর্থন করে :

$ A="X Y"
$ A+=" Z"
$ echo "$A"
X Y Z

2
আমি কি এই সিনট্যাক্সটি এক্সপোর্ট কীওয়ার্ড দিয়ে ব্যবহার করতে পারি? উদাহরণস্বরূপ export A+="Z"বা সম্ভবত Aচলকটি একবারে রফতানি করা দরকার?
লেভেস্ক

3
@ লেভেস্ক: উভয় :-)। চলকগুলি কেবল একবার রফতানি করা প্রয়োজন, তবে export A+=Zপাশাপাশি বেশ সুন্দরভাবে কাজ করে।
ঠাকলা

38
যেহেতু এটি বাশিজম, তাই আমি মনে করি এটি উল্লেখ করার মতো যে আপনি কখনও #!/bin/shএই নির্মাণ ব্যবহার করে কোনও স্ক্রিপ্টে ব্যবহার করবেন না ।
স্কোর_উন্ডার

2
এটি নির্দিষ্টভাবে এবং কেবল একটি প্লাস-সমতুল্য অপারেটর। এটি, জাভাস্ক্রিপ্টের বিপরীতে, বাশে, প্রতিধ্বনি $ এ + $ বি "এক্স ওয়াই + জেড" প্রিন্ট করে
পিএইচপিগুরু

6
বাশিজম হ'ল শেল বৈশিষ্ট্য যা কেবলমাত্র সমর্থিত bashএবং আরও কয়েকটি আরও উন্নত শেল। এটি busybox shবা dash(যা /bin/shঅনেকগুলি ডিস্ট্রোতে রয়েছে), বা /bin/shফ্রিবিএসডিতে প্রদত্ত কয়েকটি অন্যান্য শেলের অধীনে কাজ করবে না ।
স্কোর_উন্ডারে

958

প্রথমে বাশ

যেহেতু এই প্রশ্নটি বাশের পক্ষে বিশেষভাবে দাঁড়িয়েছে , আমার উত্তরের প্রথম অংশটি সঠিকভাবে এটি করার বিভিন্ন উপায় উপস্থাপন করবে:

+=: পরিবর্তনশীল সংযোজন

সিনট্যাক্সটি +=বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে:

স্ট্রিং এ যুক্ত করুন var+=...

(কারণ আমি মিতব্যয়ী, আমি মাত্র দুটি ভেরিয়েবল ব্যবহার করবে fooএবং aএবং তারপর পুরো উত্তর একই পুনরায় ব্যবহার করুন। ;-)

a=2
a+=4
echo $a
24

স্ট্যাক ওভারফ্লো প্রশ্ন সিনট্যাক্স ব্যবহার করে ,

foo="Hello"
foo+=" World"
echo $foo
Hello World

ঠিকভাবে কাজ করে!

একটি পূর্ণসংখ্যার সাথে যুক্ত করুন ((var+=...))

পরিবর্তনশীল aএকটি স্ট্রিং, কিন্তু একটি পূর্ণসংখ্যাও

echo $a
24
((a+=12))
echo $a
36

একটি অ্যারেতে যুক্ত করুন var+=(...)

আমাদের aএছাড়াও একটি মাত্র উপাদান একটি অ্যারে।

echo ${a[@]}
36

a+=(18)

echo ${a[@]}
36 18
echo ${a[0]}
36
echo ${a[1]}
18

নোট করুন যে প্রথম বন্ধনীগুলির মধ্যে একটি স্পেস বিভাজিত অ্যারে রয়েছে । আপনি যদি আপনার অ্যারেতে ফাঁকা স্থানগুলি যুক্ত স্ট্রিং সঞ্চয় করতে চান তবে আপনাকে সেগুলি বন্ধ করতে হবে:

a+=(one word "hello world!" )
bash: !": event not found

হুম .. এটি কোনও বাগ নয়, তবে একটি বৈশিষ্ট্য ... ব্যাশের বিকাশের চেষ্টা করতে বাধা দিতে !", আপনি করতে পারেন:

a+=(one word "hello world"! 'hello world!' $'hello world\041')

declare -p a
declare -a a='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="h
ello world!" [6]="hello world!")'

printf: বিল্টিন কমান্ড ব্যবহার করে ভেরিয়েবলটি পুনর্নির্মাণ করুন

printf Builtin কমান্ড স্ট্রিং বিন্যাস অঙ্কন একটি শক্তিশালী উপায় দেয়। যেহেতু এটি বাশ অন্তর্নির্মিত , তাই মুদ্রণের পরিবর্তে ভেরিয়েবেলে ফর্ম্যাট স্ট্রিং প্রেরণের বিকল্প রয়েছে stdout:

echo ${a[@]}
36 18 one word hello world! hello world! hello world!

এই অ্যারেটিতে সাতটি স্ট্রিং রয়েছে। সুতরাং আমরা ঠিক সাতটি স্থিতি যুক্তি সমন্বিত একটি ফর্ম্যাট স্ট্রিং তৈরি করতে পারি:

printf -v a "%s./.%s...'%s' '%s', '%s'=='%s'=='%s'" "${a[@]}"
echo $a
36./.18...'one' 'word', 'hello world!'=='hello world!'=='hello world!'

অথবা আমরা একটি আর্গুমেন্ট ফর্ম্যাট স্ট্রিং ব্যবহার করতে পারি যা জমা দেওয়া যত যুক্তি পুনরাবৃত্তি হবে ...

আমাদের aএখনও একটি অ্যারে নোট করুন ! শুধুমাত্র প্রথম উপাদান পরিবর্তন করা হয়!

declare -p a
declare -a a='([0]="36./.18...'\''one'\'' '\''word'\'', '\''hello world!'\''=='\
''hello world!'\''=='\''hello world!'\''" [1]="18" [2]="one" [3]="word" [4]="hel
lo world!" [5]="hello world!" [6]="hello world!")'

বাশের অধীনে, আপনি যখন সূচি নির্দিষ্ট না করে কোনও পরিবর্তনশীল নাম অ্যাক্সেস করেন, আপনি সর্বদা কেবল প্রথম উপাদানটিকেই সম্বোধন করেন!

সুতরাং আমাদের সাতটি ক্ষেত্রের অ্যারে পুনরুদ্ধার করতে, আমাদের কেবলমাত্র 1 ম উপাদানটি পুনরায় সেট করতে হবে:

a=36
declare -p a
declare -a a='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="he
llo world!" [6]="hello world!")'

অনেক যুক্তি সহ একটি আর্গুমেন্ট ফর্ম্যাট স্ট্রিং এতে চলে গেছে:

printf -v a[0] '<%s>\n' "${a[@]}"
echo "$a"
<36>
<18>
<one>
<word>
<hello world!>
<hello world!>
<hello world!>

স্ট্যাক ওভারফ্লো প্রশ্ন সিনট্যাক্স ব্যবহার করে :

foo="Hello"
printf -v foo "%s World" $foo
echo $foo
Hello World

নোট: ব্যবহার ডাবল কোট স্ট্রিং যেগুলিতে সাধিত জন্য দরকারী হতে পারে spaces, tabulationsএবং / অথবাnewlines

printf -v foo "%s World" "$foo"

শেল এখন

অধীনে POSIX শেল, আপনি ব্যবহার করতে পারে bashisms , তাই নেই builtin printf

মূলত

তবে আপনি কেবল এটি করতে পারেন:

foo="Hello"
foo="$foo World"
echo $foo
Hello World

বিন্যাসযুক্ত, কাঁটাচামচ ব্যবহার করে printf

আপনি যদি আরও পরিশীলিত নির্মাণ ব্যবহার করতে চান তবে আপনাকে কাঁটাচামচ ব্যবহার করতে হবে (নতুন শিশু প্রক্রিয়া যা কাজ করে এবং এর মাধ্যমে ফলাফলটি ফিরিয়ে দেয় stdout):

foo="Hello"
foo=$(printf "%s World" "$foo")
echo $foo
Hello World

Orতিহাসিকভাবে , আপনি কাঁটাচামচের ফলাফল পুনরুদ্ধার করতে ব্যাকটিক্স ব্যবহার করতে পারেন :

foo="Hello"
foo=`printf "%s World" "$foo"`
echo $foo
Hello World

তবে বাসা বাঁধার পক্ষে এটি সহজ নয় :

foo="Today is: "
foo=$(printf "%s %s" "$foo" "$(date)")
echo $foo
Today is: Sun Aug 4 11:58:23 CEST 2013

ব্যাকটিক্স সহ, আপনাকে ব্যাকস্ল্যাশগুলি সহ অভ্যন্তরীণ কাঁটাচামচ ছেড়ে দিতে হবে :

foo="Today is: "
foo=`printf "%s %s" "$foo" "\`date\`"`
echo $foo
Today is: Sun Aug 4 11:59:10 CEST 2013

4
+=অপারেটর এছাড়াও অনেক দ্রুত চেয়ে $a="$a$b"আমার পরীক্ষা .. কোন জ্ঞান করে তোলে।
ম্যাট

7
এই উত্তরটি দুর্দান্ত, তবে আমি মনে করি এটি var=${var}.shঅন্যান্য উত্তর থেকে উদাহরণটি হারিয়েছে , যা খুব দরকারী।
জেনোরোমা

1
কি bashশুধুমাত্র সঙ্গে শেল +=অপারেটর? আমি এটি দেখতে পোর্টেবল যথেষ্ট কিনা তা দেখতে চাই
ড্যাশেই

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

134

তুমিও এটা করতে পার:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

4
যদিও কোনও বিশেষ অক্ষর বা ফাঁকা স্থান ব্যবহার করা হয় না, ডাবল কোট, কোট এবং কোঁকড়ানো বন্ধনীগুলি বেহুদা: var=myscript;var=$var.sh;echo $varএকই প্রভাব ফেলতে পারে (ব্যাশ, ড্যাশ, ব্যস্তবক্স এবং অন্যদের অধীনে এই কাজ)।
এফ। হাউরি

@ এফ.হৌরি তা উল্লেখ করার জন্য আপনাকে ধন্যবাদ। তবে আপনি যদি একটি নম্বর সংযোজন করতে চান তবে এটি কাজ করবে না: যেমন echo $var2উত্পাদন করে নাmyscript2
পিঞ্চিয়া

@ পিঞ্চিয়া এই কাজটি বিন্যাসের কারণে .ভেরিয়েবলের নামে অবৈধ of অন্যথায় echo ${var}2বা আমার উত্তর দেখুন
এফ। হাউরি

119
bla=hello
laber=kthx
echo "${bla}ohai${laber}bye"

আউটপুট হবে

helloohaikthxbye

এটি কার্যকর হয় যখন $blaohai ভেরিয়েবলটি খুঁজে না পাওয়া ত্রুটির দিকে নিয়ে যায়। অথবা আপনার স্ট্রিংগুলিতে ফাঁকা স্থান বা অন্যান্য বিশেষ অক্ষর থাকলে। "${foo}"আপনি এতে যে কোনও কিছু রেখেছিলেন তা সঠিকভাবে পালিয়ে যায়।


3
কাজ করে না। আমি বাশ থেকে "ব্যাকআপস্টোরফোল্ডার: কমান্ড পাওয়া যায় নি" যেখানে "ব্যাকআপস্টোরফোল্ডার" একটি ভেরিয়েবলের নাম।
জিয়ান ছয়

7
এটি সিনট্যাক্সকে বেশ কিছুটা হাইলাইট করতে সহায়তা করে এবং কিছু মানুষের অস্পষ্টতা দূর করে।
রায় ফস

44
foo="Hello "
foo="$foo World"

     


10
এটি শেল স্ক্রিপ্টিংয়ের জন্য সবচেয়ে দরকারী উত্তর। আমি সর্বশেষ 30 মিনিট নিজেকে খুঁজে পেয়েছি কারণ আমার সমান চিহ্নের আগে এবং পরে স্থান ছিল !!
স্টিফান

8
foo = "$ {foo} World"
XXL

@ এক্সএক্সএল অবশ্যই আমি বারের নাম এনপ্যাপুলেট করতে বন্ধনী ব্যবহার করব। উচ্চ প্রস্তাবিত
সেরজিও এ

33

আমি সমস্যার সমাধান করার উপায়টি ঠিক is

$a$b

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

a="Hello"
b=" World"
c=$a$b
echo "$c"

যা উত্পাদন করে

Hello World

যদি আপনি অন্য স্ট্রিং দিয়ে একটি স্ট্রিং যুক্ত করতে চেষ্টা করেন, উদাহরণস্বরূপ,

a="Hello"
c="$a World"

তারপর echo "$c"উত্পাদন করা হবে

Hello World

একটি অতিরিক্ত স্থান সঙ্গে।

$aWorld

আপনি কল্পনা করতে পারেন হিসাবে কাজ করে না, কিন্তু

${a}World

উত্পাদন করে

HelloWorld

1
... সুতরাং ${a}\ Worldউত্পাদন করেHello World
জ্যাভিয়ারস্টুউব

এটি আমাকে অবাক করে; আমি c=$a$bএখানে প্রত্যাশা করতাম যে একই কাজটি c=$a Worldকরবে (যা Worldকমান্ড হিসাবে চালানোর চেষ্টা করবে )। আমি অনুমান করি যে ভেরিয়েবলগুলি প্রসারিত হওয়ার আগে অ্যাসাইনমেন্টটি পার্স করা হয়েছে ..
mwfearnley


29

এখানে বেশিরভাগ উত্তর কী বলছে তার একটি সংক্ষিপ্তসার এখানে দেওয়া হল।

ধরা যাক আমাদের দুটি ভেরিয়েবল রয়েছে এবং $ 1 'এক'তে সেট করা আছে:

set one two
a=hello
b=world

টেবিল নীচের বিভিন্ন প্রেক্ষিতে যেখানে আমরা মান একত্রিত করতে পারেন ব্যাখ্যা aএবং b, একটি নতুন পরিবর্তনশীল তৈরি করতে c

Context                               | Expression            | Result (value of c)
--------------------------------------+-----------------------+---------------------
Two variables                         | c=$a$b                | helloworld
A variable and a literal              | c=${a}_world          | hello_world
A variable and a literal              | c=$1world             | oneworld
A variable and a literal              | c=$a/world            | hello/world
A variable, a literal, with a space   | c=${a}" world"        | hello world
A more complex expression             | c="${a}_one|${b}_2"   | hello_one|world_2
Using += operator (Bash 3.1 or later) | c=$a; c+=$b           | helloworld
Append literal with +=                | c=$a; c+=" world"     | hello world

কয়েকটি নোট:

  • একটি কার্যভারের আরএইচএসকে ডাবল উদ্ধৃতিতে বদ্ধ করা সাধারণত একটি ভাল অনুশীলন, যদিও এটি বেশিরভাগ ক্ষেত্রেই বেশ alচ্ছিক is
  • += পারফরম্যান্সের দিক থেকে আরও ভাল যদি ছোট ইনক্রিমেন্টে বিশেষত একটি লুপে একটি বড় স্ট্রিং নির্মিত হয়
  • ব্যবহার {}(উপরে সারণিতে সারি 2 হিসাবে) তাদের সম্প্রসারণ দুর্বোধ্য পরিবর্তনশীল নামের প্রায়। 3 এবং 4 সারিগুলিতে যেমন দেখা যায়, ততক্ষণ কোনও {}ভেরিয়েবলের সাথে স্ট্রিংটি সংযুক্ত না করা হয় যা শেল ভেরিয়েবল নামের একটি বৈধ প্রথম অক্ষর, যা বর্ণমালা বা আন্ডারস্কোর দ্বারা শুরু হয়।

আরো দেখুন:


2
আপনার কর্মক্ষমতা নিয়ে উদ্বিগ্ন হয়, আমার উত্তর একটি বিশ্লেষণ দেখতে stackoverflow.com/a/47878161/117471
ব্রুনো Bronosky

20

তবুও অন্য পদ্ধতির ...

> H="Hello "
> U="$H""universe."
> echo $U
Hello universe.

... এবং এখনও অন্য একটি।

> H="Hello "
> U=$H"universe."
> echo $U
Hello universe.

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

1
@ কুইননুস ওপির প্রশ্নে ব্যবহৃত স্ট্রিংগুলির সাথে মেলে না এটি একটি ভাল কারণ হতে পারে।
jlliagre

20

যদি আপনি আন্ডারস্কোরের মতো কিছু যুক্ত করতে চান তবে এসেসপ (escape) ব্যবহার করুন

FILEPATH=/opt/myfile

এটি কাজ করে না :

echo $FILEPATH_$DATEX

এটি সূক্ষ্মভাবে কাজ করে:

echo $FILEPATH\\_$DATEX

11
বা বিকল্পভাবে, $ ILE ফাইলপাথ} _ $ ড্যাটেক্স। এখানে {the পরিবর্তনশীল নামের সীমানা নির্দেশ করতে ব্যবহৃত হয়। এটি তাত্পর্যপূর্ণ কারণ আন্ডারস্কোরটি পরিবর্তনশীল নামের একটি আইনী চরিত্র, সুতরাং আপনার স্নিপেট ব্যাশে প্রকৃতপক্ষে কেবল ILE ফাইলপথ নয়, ফাইল ফাইলটি সমাধান করার চেষ্টা করা হয়েছে
নিক ও'লাই

1
আমার জন্য আমার একটি ভেরিয়েবল ছিল ie var1 এবং এর পাশেই ধ্রুবক, তাই প্রতিধ্বনি $ var1_costant_traling_part আমার পক্ষে কাজ করে
YouAreAwesome

2
আমার ধারণা, পালানোর জন্য একজনকে কেবল একটি প্রতিক্রিয়া দরকার: echo $a\_$bতা করবে। নিক ও'লাইয়ের মন্তব্যে ইঙ্গিত হিসাবে আন্ডারস্কোর একটি নিয়মিত চরিত্র। সাদা জায়গাগুলি হ্যান্ডলিং স্ট্রিং, ইকো এবং কনটেনটেশনের জন্য অনেক বেশি সংবেদনশীল --- \ এই সমস্যাটি এখন থেকে আবার আসার পরে কেউ এই থ্রেডটি পুরোপুরি ব্যবহার করতে এবং পড়তে পারেন ।
জ্যাভিয়ারস্টুউ

16

উদ্ধৃতি চিহ্ন সহ সহজ উপায়:

B=Bar
b=bar
var="$B""$b""a"
echo "Hello ""$var"

1
অনেকগুলি উদ্ধৃতি চিহ্ন, আইএমএইচও। var=$B$b"a"; echo Hello\ $varকরি, আমি বিশ্বাস করি
জ্যাভিয়ারস্টুউ

আমি সমস্ত উদ্ধৃতি চিহ্ন ব্যবহার করার পরামর্শ দিচ্ছি, কারণ আপনি যদি এটি মিস করতে না পারেন এমন জায়গায় রাখেন তবে আপনাকে ভাবতে হবে না।
betontalpfa 2'18

15

আপনি উদ্ধৃতিগুলি ছাড়াই সম্মিলিত করতে পারেন। এখানে একটি উদাহরণ:

$Variable1 Open
$Variable2 Systems
$Variable3 $Variable1$Variable2
$echo $Variable3

এই শেষ বিবৃতিটি "ওপেনসিস্টেমগুলি" (উদ্ধৃতি ব্যতীত) মুদ্রণ করবে।

এটি বাশ স্ক্রিপ্টের উদাহরণ:

v1=hello
v2=world
v3="$v1       $v2"
echo $v3            # Output: hello world
echo "$v3"          # Output: hello       world

1
প্রথম ব্লকের বাক্য গঠনটি বিভ্রান্তিকর। এই চিহ্নগুলির অর্থ কী?
জ্যাভিয়ারস্টুউ

15

এমনকি যদি এখন + = অপারেটরটির অনুমতি দেওয়া হয় তবে এটি 2004 সালে বাশ 3.1 এ চালু হয়েছিল ।

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

পশ্চাদপদ সামঞ্জস্যতা সম্পর্কে যারা চিন্তা করেন তাদের জন্য, নির্বাচিত উত্তরে উল্লিখিত মতগুলি পুরানো স্ট্যান্ডার্ড বাশ কনটেনটেশন পদ্ধতিগুলির সাথে লেগে থাকুন:

foo="Hello"
foo="$foo World"
echo $foo
> Hello World

1
এটি নির্দেশ করার জন্য ধন্যবাদ, আমি কেবল এটির কাজ করতে কোন সংস্করণ প্রয়োজন তা সন্ধান করছিলাম।
রোহ ফাই

14

আমি ${}স্ট্রিংয়ে ভেরিয়েবল প্রসারণের জন্য কোঁকড়া বন্ধনী ব্যবহার করতে পছন্দ করি :

foo="Hello"
foo="${foo} World"
echo $foo
> Hello World

কোঁকড়ানো বন্ধনীগুলি ধারাবাহিক স্ট্রিং ব্যবহারের সাথে খাপ খায়:

foo="Hello"
foo="${foo}World"
echo $foo
> HelloWorld

অন্যথায় ব্যবহার foo = "$fooWorld"কাজ করবে না।


8

আপনি যা করার চেষ্টা করছেন তা যদি স্ট্রিংটিকে কয়েকটি লাইনে বিভক্ত করা হয় তবে আপনি ব্যাকস্ল্যাশ ব্যবহার করতে পারেন:

$ a="hello\
> world"
$ echo $a
helloworld

এর মধ্যে একটি স্থান সহ:

$ a="hello \
> world"
$ echo $a
hello world

এটির মধ্যে একটি মাত্র স্থান যুক্ত করে:

$ a="hello \
>      world"
$ echo $a
hello world

আমি ভীত এই কি অভিপ্রেত ছিল আছি
installero

7

নিরাপদ উপায়:

a="AAAAAAAAAAAA"
b="BBBBBBBBBBBB"
c="CCCCCCCCCCCC"
d="DD DD"
s="${a}${b}${c}${d}"
echo "$s"
AAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCDD DD

স্পেস সহ স্ট্রিংগুলি কমান্ডের অংশ হতে পারে, এই ত্রুটিগুলি এড়াতে "$ XXX" এবং "$ {XXX}" ব্যবহার করুন।

প্লাস + + সম্পর্কে অন্যান্য উত্তর একবার দেখুন


কমান্ড হিসাবে পঠিত স্থানের সাথে স্ট্রিংগুলির বিন্দু সংজ্ঞা বিন্দুতে প্রদর্শিত হয়। সুতরাং d=DD DDদিতে হবে DD: command not found--- নোট যে শেষ ডিডি, বরং ডি যে পাওয়া যায় নি। যদি সমস্ত অপারেন্ডগুলি যথাযথভাবে ফর্ম্যাট করা থাকে এবং ইতিমধ্যে প্রয়োজনীয় স্থানগুলি অন্তর্ভুক্ত থাকে, তবে আপনি s=${a}${b}${c}${d}; echo $sকম উদ্ধৃতি চিহ্ন সহ সহজভাবে সংমিশ্রণ করতে পারেন । এছাড়াও আপনি \ এই সমস্যাগুলি এড়াতে (পলিত শ্বেতস্থান) ব্যবহার করতে পারেন --- d=echo\ echoকোনও প্রতিধ্বনির প্রবর্তন করবে না, যেখানে d=echo echoহবে।
জ্যাভিয়ারস্টুউ

7

একটি বিশেষ ক্ষেত্রে রয়েছে যেখানে আপনার যত্ন নেওয়া উচিত:

user=daniel
cat > output.file << EOF
"$user"san
EOF

আউটপুট হবে "daniel"san, এবং না danielsan, যেমন আপনি চেয়েছিলেন। এই ক্ষেত্রে পরিবর্তে আপনার করা উচিত:

user=daniel
cat > output.file << EOF
${user}san
EOF

6
a="Hello,"
a=$a" World!"
echo $a

এইভাবে আপনি দুটি স্ট্রিং সংযুক্ত করেন।


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

5

এটি যদি আপনার " World"মূল স্ট্রিংয়ে যোগ করার উদাহরণ হিসাবে থাকে তবে তা হতে পারে:

#!/bin/bash

foo="Hello"
foo=$foo" World"
echo $foo

আউটপুট:

Hello World


5

কর্মক্ষমতা সম্পর্কে ভয়েসড উদ্বেগ রয়েছে, তবে কোনও ডেটা অফার করা হয় না। আমাকে একটি সহজ পরীক্ষা পরামর্শ দিন।

(দ্রষ্টব্য: dateম্যাকোস-এ ন্যানোসেকেন্ডগুলি সরবরাহ করে না, তাই এটি অবশ্যই লিনাক্সে করা উচিত))

আমি সামগ্রীগুলি সহ গিটহাবে অ্যাপেনডেস্টেস্ট.শ তৈরি করেছি :

#!/bin/bash -e

output(){
    ptime=$ctime;
    ctime=$(date +%s.%N);
    delta=$(bc <<<"$ctime - $ptime");
    printf "%2s. %16s chars  time: %s  delta: %s\n" $n "$(bc <<<"10*(2^$n)")" $ctime $delta;
}

method1(){
    echo 'Method: a="$a$a"'
    for n in {1..32}; do a="$a$a"; output; done
}

method2(){
    echo 'Method: a+="$a"'
    for n in {1..32}; do a+="$a";  output; done
}

ctime=0; a="0123456789"; time method$1

পরীক্ষা 1:

$ ./append_test.sh 1
Method: a="$a$a"
 1.               20 chars  time: 1513640431.861671143  delta: 1513640431.861671143
 2.               40 chars  time: 1513640431.865036344  delta: .003365201
 3.               80 chars  time: 1513640431.868200952  delta: .003164608
 4.              160 chars  time: 1513640431.871273553  delta: .003072601
 5.              320 chars  time: 1513640431.874358253  delta: .003084700
 6.              640 chars  time: 1513640431.877454625  delta: .003096372
 7.             1280 chars  time: 1513640431.880551786  delta: .003097161
 8.             2560 chars  time: 1513640431.883652169  delta: .003100383
 9.             5120 chars  time: 1513640431.886777451  delta: .003125282
10.            10240 chars  time: 1513640431.890066444  delta: .003288993
11.            20480 chars  time: 1513640431.893488326  delta: .003421882
12.            40960 chars  time: 1513640431.897273327  delta: .003785001
13.            81920 chars  time: 1513640431.901740563  delta: .004467236
14.           163840 chars  time: 1513640431.907592388  delta: .005851825
15.           327680 chars  time: 1513640431.916233664  delta: .008641276
16.           655360 chars  time: 1513640431.930577599  delta: .014343935
17.          1310720 chars  time: 1513640431.954343112  delta: .023765513
18.          2621440 chars  time: 1513640431.999438581  delta: .045095469
19.          5242880 chars  time: 1513640432.086792464  delta: .087353883
20.         10485760 chars  time: 1513640432.278492932  delta: .191700468
21.         20971520 chars  time: 1513640432.672274631  delta: .393781699
22.         41943040 chars  time: 1513640433.456406517  delta: .784131886
23.         83886080 chars  time: 1513640435.012385162  delta: 1.555978645
24.        167772160 chars  time: 1513640438.103865613  delta: 3.091480451
25.        335544320 chars  time: 1513640444.267009677  delta: 6.163144064
./append_test.sh: fork: Cannot allocate memory

পরীক্ষা 2:

$ ./append_test.sh 2
Method: a+="$a"
 1.               20 chars  time: 1513640473.460480052  delta: 1513640473.460480052
 2.               40 chars  time: 1513640473.463738638  delta: .003258586
 3.               80 chars  time: 1513640473.466868613  delta: .003129975
 4.              160 chars  time: 1513640473.469948300  delta: .003079687
 5.              320 chars  time: 1513640473.473001255  delta: .003052955
 6.              640 chars  time: 1513640473.476086165  delta: .003084910
 7.             1280 chars  time: 1513640473.479196664  delta: .003110499
 8.             2560 chars  time: 1513640473.482355769  delta: .003159105
 9.             5120 chars  time: 1513640473.485495401  delta: .003139632
10.            10240 chars  time: 1513640473.488655040  delta: .003159639
11.            20480 chars  time: 1513640473.491946159  delta: .003291119
12.            40960 chars  time: 1513640473.495354094  delta: .003407935
13.            81920 chars  time: 1513640473.499138230  delta: .003784136
14.           163840 chars  time: 1513640473.503646917  delta: .004508687
15.           327680 chars  time: 1513640473.509647651  delta: .006000734
16.           655360 chars  time: 1513640473.518517787  delta: .008870136
17.          1310720 chars  time: 1513640473.533228130  delta: .014710343
18.          2621440 chars  time: 1513640473.560111613  delta: .026883483
19.          5242880 chars  time: 1513640473.606959569  delta: .046847956
20.         10485760 chars  time: 1513640473.699051712  delta: .092092143
21.         20971520 chars  time: 1513640473.898097661  delta: .199045949
22.         41943040 chars  time: 1513640474.299620758  delta: .401523097
23.         83886080 chars  time: 1513640475.092311556  delta: .792690798
24.        167772160 chars  time: 1513640476.660698221  delta: 1.568386665
25.        335544320 chars  time: 1513640479.776806227  delta: 3.116108006
./append_test.sh: fork: Cannot allocate memory

ত্রুটিগুলি নির্দেশ করে যে আমার বাশটি ক্র্যাশ হওয়ার আগে 335.54432 এমবি পর্যন্ত উঠেছিল । আপনি কোডটি দ্বিগুণ করার থেকে আরও বেশি দানাদার গ্রাফ এবং ব্যর্থতা পয়েন্ট পেতে ধ্রুবক যুক্ত করতে কোড পরিবর্তন করতে পারেন। তবে আমি মনে করি এটি যত্নশীল কিনা তা স্থির করার জন্য আপনাকে যথেষ্ট তথ্য দেওয়া উচিত। ব্যক্তিগতভাবে, আমি 100 এমবি নীচে না। আপনার মাইলেজ পরিবর্তিত হতে পারে.


মজাদার! বিবেচনা করুন: join <(LANG=C bash -c 'a="a" c=1 last=${EPOCHREALTIME//.};while :;do a+=$a;now=${EPOCHREALTIME//.};echo $((c++)) ${#a} $((now-last));last=$now;done') <(LANG=C bash -c 'a="a" c=1 last=${EPOCHREALTIME//.};while :;do a=$a$a;now=${EPOCHREALTIME//.};echo $((c++)) ${#a} $((now-last));last=$now;done')|sed -ue '1icnt strlen a+=$a a=$a$a' -e 's/^\([0-9]\+\) \([0-9]\+\) \([0-9]\+\) \2/\1 \2 \3/' | xargs printf "%4s %11s %9s %9s\n"(উত্পাদনশীল নয় এমন হোস্টের জন্য এটি চেষ্টা করুন !!;)
এফ। হাউরি

4

আমি একটি তালিকা থেকে একটি স্ট্রিং তৈরি করতে চেয়েছিলাম। এর জন্য কোনও উত্তর খুঁজে পাইনি তাই আমি এটি এখানে পোস্ট করছি। আমি যা করেছি তা এখানে:

list=(1 2 3 4 5)
string=''

for elm in "${list[@]}"; do
    string="${string} ${elm}"
done

echo ${string}

এবং তারপর আমি নিম্নলিখিত আউটপুট পেতে:

1 2 3 4 5

4

বিশেষ অপারেটর থাকা সত্ত্বেও +=, একত্রীকরণের জন্য, আরও সহজ সরল পথ রয়েছে:

foo='Hello'
foo=$foo' World'
echo $foo

ডাবল উদ্ধৃতিগুলি ভিতরে ভেরিয়েবলগুলির ব্যাখ্যার জন্য একটি অতিরিক্ত গণনার সময় নেয়। সম্ভব হলে এড়িয়ে চলুন।


3

মনে রাখবেন যে এটি কাজ করবে না

foo=HELLO
bar=WORLD
foobar=PREFIX_$foo_$bar

যেহেতু মনে হয় $ foo বাদ পড়ে এবং আপনাকে ছেড়ে দেয়:

PREFIX_WORLD

তবে এটি কাজ করবে:

foobar=PREFIX_"$foo"_"$bar"

এবং আপনাকে সঠিক আউটপুট দিয়ে চলে যাবে:

PREFIX_HELLO_WORLD


8
এটি ঘটে কারণ আন্ডারস্কোরটি ভেরিয়েবলের নামগুলিতে বৈধ অক্ষর, সুতরাং বাশ foo_ কে ভেরিয়েবল হিসাবে দেখবে।
বাশকে যখন সঠিক বর্ণের

1

সুবিধাজনক হলে আমি এটি এইভাবে করি: একটি ইনলাইন কমান্ড ব্যবহার করুন!

echo "The current time is `date`"
echo "Current User: `echo $USER`"

1
1 ম লাইনে, আপনি পরিবর্তে : ব্যবহার করে একটি কাঁটাচামচ ফেলে দিতে পারেন । সাম্প্রতিক ব্যাশ অধীনে, আপনি লিখতে পারে: । date "+The current time is %a %b %d %Y +%T"echo ...$(date)printf "The current time is %(%a %b %d %Y +%T)T\n" -1
এফ হাউরি


1

আমার মতে, দুটি স্ট্রিং সংমিশ্রনের সহজতম উপায় হ'ল একটি ফাংশন লিখুন যা এটি আপনার জন্য করে, তারপরে সেই ফাংশনটি ব্যবহার করুন।

function concat ()
{
    prefix=$1
    suffix=$2

    echo "${prefix}${suffix}"
}

foo="Super"
bar="man"

concat $foo $bar   # Superman

alien=$(concat $foo $bar)

echo $alien        # Superman

-1

আমি এক ধরনের দ্রুত কাজ করা পছন্দ করি।

#! /bin/sh -f
function combo() {
    echo $@
}

echo $(combo 'foo''bar')

তবুও বিড়ালের চামড়ার অন্য উপায় way এবারে ফাংশন সহ: ডি


একটি ফাংশন কল করা, এটিও একটি সাব-শেলের মধ্যে, একটি সাধারণ কনক্টের জন্য খুব বেশি ওভারকিল।
কোডফোরস্টার

-1

আমি এখনও পিএইচপি সম্পর্কে জানি না, তবে এটি লিনাক্স ব্যাশে কাজ করে। আপনি যদি এটি কোনও পরিবর্তনশীলকে প্রভাবিত করতে না চান তবে আপনি এটি চেষ্টা করতে পারেন:

read pp;  *# Assumes I will affect Hello to pp*
pp=$( printf $pp ;printf ' World'; printf '!');
echo $pp;

>Hello World!

আপনি 'হ্যালো' বা '!' এর পরিবর্তে অন্য পরিবর্তনশীল রাখতে পারেন। আপনি আরও স্ট্রিং সংহত করতে পারেন।


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