कैसे बैश में स्ट्रिंग चर समवर्ती करने के लिए


2765

PHP में, स्ट्रिंग्स को एक साथ इस प्रकार संकलित किया जाता है:

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

यहाँ, $foo"हैलो वर्ल्ड" बन जाता है।

यह बैश में कैसे पूरा किया जाता है?


6
foo="Hello" foo=$foo" World" echo $foo इसके बजाय "#! / बिन / श" के लिए काम किया
पैराश्री

1
अगर आप बिना स्पेस के HelloWorld चाहते हैं तो क्या करें?
आदि

@ अदीfoo1="World" foo2="Hello" foo3="$foo1$foo2"
जीनकोड

रिक्त स्थान बाश में बात करता है)
कैपिबार

जवाबों:


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

सामान्य तौर पर दो चर को समाप्‍त करने के लिए आप उन्‍हें एक के बाद एक लिख सकते हैं:

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

314
$fooडबल कोट्स के अंदर डालने की आदत डालने के लिए शायद अच्छा है , उस समय के लिए जब यह वास्तव में मायने रखता है।
कैस्केबेल

104
हमें हमेशा ऐसा करने के लिए सिखाया जाता है क्योंकि जब प्रतिस्थापन होता है, तो शेल द्वारा रिक्त स्थान को अनदेखा किया जाएगा, लेकिन दोहरे उद्धरण हमेशा उन रिक्त स्थान की रक्षा करेंगे।
स्ट्रॉबेरी

62
क्या आपके पहले उदाहरण में कोई स्थान होना चाहिए? क्या ऐसा कुछ करना संभव है foo="$fooworld"? मैं नहीं
मानूंगा

341
@nonsensickle नाम के एक वैरिएबल की तलाश करेगा fooworld। जैसा कि ब्रेसिज़ के साथ किया जाता है, उसे अलग करना foo="${foo}world"...
ट्वेलबर्गबर्ग

4
@ JVE999 हाँ, जो अच्छी तरह से काम करता है, हालांकि मेरी राय में यह कोड स्पष्टता के लिए उतना अच्छा नहीं है ... लेकिन यह सिर्फ मेरी प्राथमिकता हो सकती है ... कुछ अन्य तरीके हैं जो इसे भी किया जा सकता है - बिंदु है यह सुनिश्चित करना कि चर नाम गैर-चर-नाम भागों से अलग किया गया है ताकि यह सही ढंग से पार्स हो।
ट्वेलबर्ग

1127

बैश भी एक +=ऑपरेटर का समर्थन करता है जैसा कि इस कोड में दिखाया गया है:

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

2
क्या मैं इस वाक्यविन्यास का उपयोग निर्यात खोजशब्द के साथ कर सकता हूँ? उदाहरण के लिए export A+="Z"या शायद Aचर को केवल एक बार निर्यात करने की आवश्यकता है?
लेवेस्क

3
@levesque: दोनों :-)। चर को केवल एक बार निर्यात करने की आवश्यकता होती है, लेकिन export A+=Zसाथ ही साथ काफी अच्छी तरह से काम करता है।
थकाला

38
चूंकि यह एक बशीवाद है, मुझे लगता है कि यह एक उल्लेख के लायक है कि आपको #!/bin/shइस निर्माण का उपयोग करने वाली स्क्रिप्ट में कभी भी उपयोग नहीं करना चाहिए ।
स्कोर_उंडर

2
यह विशेष रूप से और केवल एक प्लस-बराबर ऑपरेटर है। यह है कि, जावास्क्रिप्ट के विपरीत, बैश में, $ A + $ B प्रिंट "X Y + Z"
phpguru

6
एक बैशीवाद एक शेल विशेषता है जो केवल bashऔर कुछ अन्य उन्नत शेल में समर्थित है । यह busybox shया dash(जो /bin/shबहुत डिस्ट्रोस पर है) के तहत काम नहीं करेगा , या कुछ अन्य गोले जैसे /bin/shFreeBSD पर प्रदान किए जाएंगे।
स्कोर_उंडर

959

बैश पहले

चूंकि यह प्रश्न विशेष रूप से बैश के लिए खड़ा है , इसलिए उत्तर का मेरा पहला भाग इसे ठीक से करने के विभिन्न तरीके प्रस्तुत करेगा:

+=: चर के लिए आवेदन करें

वाक्यविन्यास +=का उपयोग विभिन्न तरीकों से किया जा सकता है:

स्ट्रिंग के लिए आवेदन करें 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 निर्मित कमांड स्ट्रिंग प्रारूप ड्राइंग का एक शक्तिशाली तरीका देता है। चूंकि यह बैश बिलिन है , इसलिए प्रिंटिंग पर बदले हुए स्वरूपित स्ट्रिंग को चर में भेजने का विकल्प है 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

ऐतिहासिक रूप से, आप कांटा का परिणाम प्राप्त करने के लिए backticks का उपयोग कर सकते हैं :

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केवल के साथ खोल +=ऑपरेटर? मैं देखना चाहता हूँ अगर यह होता है पोर्टेबल पर्याप्त
dashesy

1
@ डैडी नं। मैं निश्चित रूप से +=ऑपरेटर के साथ एकमात्र शेल नहीं हूं , लेकिन यह सभी तरीके बशीज़ हैं , इसलिए पोर्टेबल नहीं हैं! यहां तक ​​कि आप गलत बैश संस्करण के मामले में विशेष बग का सामना कर सकते हैं!
एफ। हौरी

134

आप भी यह कर सकते हैं:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

4
जबकि कोई विशेष वर्ण, और न ही रिक्त स्थान का उपयोग किया जाता है, दोहरे उद्धरण, उद्धरण और घुंघराले कोष्ठक बेकार हैं: var=myscript;var=$var.sh;echo $varएक ही प्रभाव होगा (यह काम के तहत बाश, डैश, बिजीबॉक्स और अन्य)।
एफ। होरी

@ F.Hauri ने आपको इस बात के लिए धन्यवाद दिया। लेकिन अगर आप एक संख्या को जोड़ते हैं, तो यह काम नहीं करेगा: जैसे echo $var2कि उत्पादन नहीं करता हैmyscript2
Pynchia

@Pynchia .वैरिएबल नाम में डॉट अवैध होने के कारण यह काम करता है । अगर मेरे जवाब को कोई echo ${var}2और देखता है या नहीं
F. Hauri

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

उत्पादन करेगा

helloohaikthxbye

यह तब उपयोगी $blaohai होता है जब एक चर को त्रुटि नहीं मिलती है। या यदि आपके स्ट्रिंग्स में स्थान या अन्य विशेष वर्ण हैं। "${foo}"ठीक से तुम में डाल कुछ बच जाता है।


3
काम नहीं करता है। मुझे bash से "backupstorefolder: कमांड नहीं मिला" जहां "backupstorefolder" एक वैरिएबल का नाम है।
जियान चोय

7
यह वाक्यविन्यास को काफी हद तक उजागर करने में मदद करता है, और कुछ मानव अस्पष्टता को हटाता है।
रे फॉस

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

     


10
यह शेल स्क्रिप्टिंग के लिए सबसे उपयोगी उत्तर है। मैंने खुद को अंतिम 30 मिनट में पाया है क्योंकि मेरे पास बराबर संकेत से पहले और बाद में एक जगह थी !!
स्टीफन

8
foo = "$ {foo} दुनिया"
XXL

@XXL निश्चित रूप से मैं var के नाम को एनकैप्सुलेट करने के लिए कोष्ठक का उपयोग करूंगा। अत्यधिक अनुशंसित
सर्जियो ए।

33

जिस तरह से मैं इस समस्या को हल करेंगे बस है

$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
XavierStuvw

यह मुझे आश्चर्यचकित करता है; मुझे उम्मीद थी कि c=$a$bयहाँ भी वही काम c=$a Worldहोगा (जो Worldकमांड के रूप में चलने की कोशिश करेगा )। मुझे लगता है कि चर का विस्तार होने से पहले असाइनमेंट को पार्स किया जाता है ..
mwfearnley

30

यहाँ एक संक्षिप्त सारांश है कि अधिकांश उत्तर किस बारे में बात कर रहे हैं।

मान लें कि हमारे पास दो चर हैं और $ 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

कुछ नोट:

  • दोहरे उद्धरण चिह्नों में असाइनमेंट के आरएचएस को संलग्न करना आम तौर पर एक अच्छा अभ्यास है, हालांकि यह कई मामलों में काफी वैकल्पिक है
  • += एक प्रदर्शन के दृष्टिकोण से बेहतर है अगर एक बड़ी स्ट्रिंग का निर्माण छोटे वेतन वृद्धि में किया जा रहा है, खासकर एक लूप में
  • {}उनके विस्तार को अस्वीकार करने के लिए चर नामों का उपयोग करें (जैसा कि ऊपर तालिका में पंक्ति 2 में है)। जैसा कि 3 और 4 पंक्तियों पर देखा जाता है, {}जब तक कि एक चर को स्ट्रिंग के साथ संकलित नहीं किया जा सकता है, तब तक इसकी कोई आवश्यकता नहीं है जो एक वर्ण से शुरू होता है जो शेल चर नाम में एक मान्य पहला वर्ण है, जो वर्णमाला या अंडरस्कोर है।

यह सभी देखें:


2
यदि आप प्रदर्शन के बारे में चिंतित हैं, तो मेरे उत्तर में एक विश्लेषण देखें stackoverflow.com/a/47878161/117471
ब्रूनो ब्रोंस्की


20

फिर भी एक और दृष्टिकोण ...

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

... और अभी तक एक और एक।

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

1
यही मैंने किया, और मुझे यह अन्य उत्तरों की तुलना में बहुत सरल और सीधा-सा लगा। क्या कोई कारण नहीं है कि सबसे अधिक वोट किए गए उत्तरों में से कोई भी इस विकल्प को इंगित नहीं करता है?
12

1
@quimnuss तथ्य यह है कि ओपी प्रश्न में उपयोग किए गए तार मेल नहीं खाते हैं, यह एक अच्छा कारण हो सकता है।
jlliagre

20

यदि आप किसी अंडरस्कोर की तरह कुछ जोड़ना चाहते हैं, तो एस्केप (\) का उपयोग करें

FILEPATH=/opt/myfile

यह काम नहीं करता है:

echo $FILEPATH_$DATEX

यह ठीक काम करता है:

echo $FILEPATH\\_$DATEX

11
या वैकल्पिक रूप से, $ {FILEPATH} _ $ DATEX। यहाँ {} का उपयोग चर नाम की सीमाओं को इंगित करने के लिए किया जाता है। यह परिशिष्ट है क्योंकि अंडरस्कोर वैरिएबल नामों में एक कानूनी चरित्र है, इसलिए आपके स्निपेट बैश में वास्तव में FILEPATH_ को हल करने की कोशिश की जाती है, न कि केवल $ FILEPATH
Nik O'Lai

1
मेरे लिए मेरे पास एक चर यानी $ var1 और इसके आगे स्थिर था, इसलिए मेरे लिए $ var1_costant_traling_part काम करता है
YouAreAwesome

2
मुझे लगता है कि किसी को भागने के लिए केवल एक बैकलैश की जरूरत है: echo $a\_$bक्या करेंगे। जैसा कि निक ओ'लाई की टिप्पणी में संकेत दिया गया है कि अंडरस्कोर एक नियमित चरित्र है। सफेद रिक्त स्थान की हैंडलिंग स्ट्रिंग्स, प्रतिध्वनि और संघनन के लिए बहुत अधिक संवेदनशील होती है --- कोई भी \ इस धागे को अच्छी तरह से उपयोग और पढ़ सकता है क्योंकि यह मुद्दा अब और फिर वापस आता है।
XavierStuvw

16

उद्धरण चिह्नों के साथ सबसे सरल तरीका:

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

1
बहुत सारे उद्धरण चिह्न, IMHO। var=$B$b"a"; echo Hello\ $varमुझे विश्वास है
XavierStuvw

मैं उद्धरण चिह्नों के सभी का उपयोग करने का सुझाव देता हूं, यदि आप इसे हर जगह डालते हैं तो आप याद नहीं कर सकते हैं, तो आपको नहीं सोचना चाहिए।
betontalpfa

15

आप उद्धरण के बिना संक्षिप्त कर सकते हैं। यहाँ एक उदाहरण है:

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

यह अंतिम कथन "OpenSystems" (बिना उद्धरण के) छापेगा।

यह बैश स्क्रिप्ट का एक उदाहरण है:

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

1
पहले ब्लॉक का सिंटैक्स भ्रामक है। इन $ संकेतों का क्या मतलब है?
XavierStuvw

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होगा।
XavierStuvw

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

प्रदर्शन के बारे में आवाज उठाई जाती है, लेकिन कोई डेटा पेश नहीं किया जाता है। मुझे एक सरल परीक्षा का सुझाव दें।

(नोट: datemacOS पर नैनोसेकेंड की पेशकश नहीं है, इसलिए इसे लिनक्स पर किया जाना चाहिए।)

मैंने सामग्री के साथ GitHub पर append_test.sh बनाया है :

#!/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

के रूप में यह $ फू छोड़ने के लिए लगता है और आप के साथ छोड़ देता है:

PREFIX_WORLD

लेकिन यह काम करेगा:

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

और सही आउटपुट के साथ आपको छोड़ दें:

PREFIX_HELLO_WORLD


8
यह इसलिए होता है क्योंकि अंडरस्कोर वैरिएबल नामों में मान्य वर्ण होता है, इसलिए बैश foo_ को वेरिएबल के रूप में देखता है। जब सटीक वैर नाम सीमाओं को बताना आवश्यक हो, तो घुंघराले ब्रेसिज़ का उपयोग किया जा सकता है: PREFIX _ $ {foo} _ $ bar
Nik O'Lai

2

यहाँ AWK के माध्यम से एक है :

$ foo="Hello"
$ foo=$(awk -v var=$foo 'BEGIN{print var" World"}')
$ echo $foo
Hello World

1
अच्छा, लेकिन मुझे लगता है कि मैं पायथन का उपयोग करके अधिक सटीकता प्राप्त कर सकता हूं!
टेक्नो

1

मैं इसे इस तरह से करता हूं जब सुविधाजनक: एक इनलाइन कमांड का उपयोग करें!

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

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')

फिर भी एक बिल्ली की त्वचा के लिए एक और तरीका है। इस बार कार्यों के साथ: डी


किसी फ़ंक्शन को कॉल करना, वह भी एक सबस्क्रिप्शन में, एक साधारण कॉनकैट के लिए बहुत अधिक ओवरकिल है।
कोडपॉस्टर

-1

मैं अभी तक PHP के बारे में नहीं जानता, लेकिन यह लिनक्स बैश में काम करता है। यदि आप इसे एक चर पर प्रभावित नहीं करना चाहते हैं, तो आप यह कोशिश कर सकते हैं:

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

>Hello World!

आप 'हैलो' या '!' के बजाय एक और वेरिएबल रख सकते हैं। आप और भी तार जोड़ सकते हैं।


2
एक सरल संयोजन करने के लिए एक उपधारा का उपयोग करना बहुत महंगा है!
19for में कोडपेस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.