सवाल बैश में स्ट्रिंग चर को कैसे जोड़ें


PHP में, तारों को एक साथ समेकित किया जाता है:

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

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

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


2102
2017-11-15 05:38


मूल


foo="Hello"  foo=$foo" World"  echo $foo      यह "#! / बिन / श" के लिए काम किया - parasrish
यदि आप अंतरिक्ष के बिना हैलोवर्ल्ड चाहते हैं तो क्या करें? - Adi


जवाब:


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

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

a='hello'
b='world'
c=$a$b
echo $c
> helloworld

2852
2017-11-15 05:41



डालने की आदत में शायद अच्छा लगा $foo डबल कोट्स के अंदर, उस समय के लिए जब यह वास्तव में मायने रखता है। - Cascabel
हमें हमेशा ऐसा करने के लिए सिखाया जाता है क्योंकि जब प्रतिस्थापन होता है, तो रिक्त स्थान को रिक्त स्थान से अनदेखा कर दिया जाएगा, लेकिन डबल कोट्स हमेशा उन रिक्त स्थानों की रक्षा करेंगे। - Strawberry
क्या आपके पहले उदाहरण में कोई जगह होनी चाहिए? क्या ऐसा कुछ करना संभव है foo="$fooworld"? मैं नहीं मानूंगा ... - nonsensickle
@nonsensickle वह एक चर नाम के लिए देखेंगे fooworld। असंबद्ध जो ब्रेसिज़ के साथ किया जाता है, जैसा कि अंदर है foo="${foo}world"... - twalberg
@ जेवी 999 हां, यह भी काम करता है, हालांकि मेरी राय में यह कोड स्पष्टता के लिए काफी अच्छा नहीं है ... लेकिन यह मेरी प्राथमिकता हो सकती है ... इसके अलावा कुछ और तरीके भी किए जा सकते हैं - बिंदु है यह सुनिश्चित करना कि परिवर्तनीय नाम गैर-परिवर्तनीय-नाम भागों से अलग है ताकि यह सही ढंग से पार हो जाए। - twalberg


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

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

939
2017-11-15 08:33



यह स्वीकार किए गए उत्तर से बहुत बेहतर है, धन्यवाद! इस सवाल को खोजने में आसान बनाने के लिए टैग के रूप में "संलग्न करें" जोड़ा गया। - noamtm
क्या मैं निर्यात वाक्य के साथ इस वाक्यविन्यास का उपयोग कर सकता हूं? जैसे export A+="Z" या शायद A परिवर्तनीय केवल एक बार निर्यात किया जाना चाहिए? - levesque
@levesque: दोनों :-)। चर केवल एक बार निर्यात किया जाना चाहिए, लेकिन export A+=Z काफी अच्छी तरह से काम करता है। - thkala
चूंकि यह एक झुकाव है, मुझे लगता है कि यह उल्लेखनीय है कि आपको कभी भी इसका उपयोग नहीं करना चाहिए #!/bin/sh इस निर्माण का उपयोग कर एक स्क्रिप्ट में। - Score_Under
यह विशेष रूप से और केवल एक प्लस-बराबर ऑपरेटर है। बैश में, जावास्क्रिप्ट के विपरीत, $ ए + $ बी प्रिंट करता है "एक्स वाई + जेड" - phpguru


पहले बैश

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

+=: चर में संलग्न करें

वाक्यविन्यास += विभिन्न तरीकों से इस्तेमाल किया जा सकता है:

स्ट्रिंग में संलग्न करें 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: का उपयोग कर परिवर्तनीय पुन: निर्माण builtin आदेश

printf  builtin आदेश स्ट्रिंग प्रारूप ड्राइंग का एक शक्तिशाली तरीका देता है। चूंकि यह एक बैश है 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

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

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

807
2017-08-04 10:04



+= ऑपरेटर भी बहुत तेज है $a="$a$b" मेरे परीक्षण में .. जो समझ में आता है। - Matt
यह जवाब कमाल है, लेकिन मुझे लगता है कि यह गायब है var=${var}.sh अन्य उत्तरों से उदाहरण, जो बहुत उपयोगी है। - geneorama
है bash के साथ एकमात्र खोल += ऑपरेटर? मैं देखना चाहता हूं कि यह पोर्टेबल पर्याप्त है या नहीं - dashesy
@ डैशी संख्या मैं निश्चित रूप से एकमात्र खोल नहीं है +=ऑपरेटर, लेकिन इन सभी तरीकों से हैं bashismsतो पोर्टेबल नहीं! गलत बैश संस्करण के मामले में भी आपको विशेष बग का सामना करना पड़ सकता है! - F. Hauri


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

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

114
2017-10-28 03:09



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


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

उत्पादन होगा

helloohaikthxbye

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


103
2017-07-25 15:48



काम नहीं करता मुझे "बैकअपस्टोरफोल्डर: कमांड नहीं मिला" बैश से मिलता है जहां "बैकअपस्टोरफोल्डर" एक चर का नाम है। - Zian Choy
यह वाक्यविन्यास को थोड़ा सा हाइलाइट करने में मदद करता है, और कुछ मानव अस्पष्टता को हटा देता है। - Ray Foss


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


35
2017-11-15 05:44



शैल स्क्रिप्टिंग के लिए यह सबसे उपयोगी उत्तर है। मैंने खुद को पिछले 30 मिनट में पाया है क्योंकि मेरे बराबर चिह्न से पहले और बाद में एक जगह थी !! - Stefan
foo = "$ {foo} दुनिया" - XXL


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

$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

29
2018-03-07 16:43



...अत ${a}\ World पैदा करता है Hello World - XavierStuvw


$ a=hip
$ b=hop
$ ab=$a$b
$ echo $ab
hiphop
$ echo $a$b
hiphop

22
2017-11-15 05:42





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

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

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

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

18
2018-03-18 08:24



मैंने यही किया, और मैंने इसे अन्य उत्तरों की तुलना में इतना सरल और सीधा-आगे पाया। क्या इस बात का कोई कारण नहीं है कि सबसे अधिक वोट दिए गए उत्तरों पर इस विकल्प को इंगित किया गया है? - quimnuss
@quimnuss तथ्य यह है कि स्ट्रिंग ओपी प्रश्न में इस्तेमाल किए गए लोगों से मेल नहीं खाती है, यह एक अच्छा कारण हो सकता है। - jlliagre
... और अभी तक अभी तक एक और एक: U=${H}universe..... - XavierStuvw


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

FILEPATH=/opt/myfile

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

echo $FILEPATH_$DATEX

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

echo $FILEPATH\\_$DATEX

18
2017-09-20 19:15



या वैकल्पिक रूप से, $ {FILEPATH} _ $ DATEX। यहां {} वेरिएबल नाम की सीमाओं को इंगित करने के लिए उपयोग किया जाता है। यह अप्रासंगिक है क्योंकि अंडरस्कोर परिवर्तनीय नामों में एक कानूनी चरित्र है, इसलिए आपके स्निपेट बैश में वास्तव में FILEPATH_ को हल करने का प्रयास करता है, न केवल $ FILEPATH - Nik O'Lai
मेरे लिए मेरे पास एक वैरिएबल i.e. $ var1 और इसके बगल में स्थिर था, इसलिए echo $ var1_costant_traling_part मेरे लिए काम करता है - Indrajeet Gour
मुझे लगता है कि भागने के लिए केवल एक बैकलाश की आवश्यकता है: echo $a\_$b करेंगे। जैसा कि निक ओलाई की टिप्पणी में संकेत दिया गया है अंडरस्कोर एक नियमित चरित्र है। सफेद रिक्त स्थान का संचालन स्ट्रिंग्स, इको और कॉन्सटेनेशन के लिए अधिक संवेदनशील है --- कोई भी उपयोग कर सकता है \  और इस धागे को अच्छी तरह से पढ़ें क्योंकि यह समस्या अब और फिर वापस आती है। - XavierStuvw


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

$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

13
2017-11-15 07:40



पहले ब्लॉक का वाक्यविन्यास उलझन में है। इन $ संकेतों का क्या अर्थ है? - XavierStuvw