Kaip sujungti string kintamuosius bash

PHP, stygos sujungiamos taip:

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

Čia $foo tampa „Hello World“.

Kaip tai pasiekiama bash?

2309
15 нояб. rinkinys Strawberry 15 nov. 2010-11-15 08:38 '10, 8:38, 2010-11-15 08:38
@ 28 atsakymai
 foo="Hello" foo="$foo World" echo $foo > Hello World 

Apskritai, jei norite sujungti du kintamuosius, galite juos rašyti vienas po kito:

 a='hello' b='world' c="$a$b" echo $c > helloworld 
3132
15 нояб. atsakymas į kodą yra lapkričio 15 d. 2010-11-15 08:41 '10 8:41 val. 2010-11-15 08:41

„Bash“ taip pat palaiko += operatorių, kaip parodyta šiame kode:

border=0
 $ A="XY" $ A+=" Z" $ echo "$A" XYZ 
990
15 нояб. Atsakymas pateikiamas vasario 15 d. 2010-11-15 11:33 '10, 11:33 2010-11-15 11:33

Bash pirma

Kadangi šis klausimas skirtas konkrečiai Bashui , mano pirmoji atsakymo dalis parodys įvairius būdus, kaip tai padaryti teisingai:

+= : Pridėti į kintamąjį

Sintaksė += gali būti naudojama įvairiais būdais:

Pridėti prie eilutės var+=...

(Kadangi aš esu nuolankus, aš naudosiu tik du kintamuosius foo ir a , tada juos naudosiu visame atsakyme. ;-)

 a=2 a+=4 echo $a 24 

Naudojant Stack Overflow klausimo sintaksę,

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

puikiai veikia!

Pridėti į sveikąjį skaičių ((var+=...))

a yra eilutė, bet ir sveikasis skaičius

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

Pridėti prie masyvo var+=(...)

Mūsų a pat yra tik vieno elemento masyvas.

 echo ${a[@]} 36 a+=(18) echo ${a[@]} 36 18 echo ${a[0]} 36 echo ${a[1]} 18 

Atkreipkite dėmesį, kad tarp skliaustelių yra atskirtas tarpas. Jei norite matricoje įrašyti eilutę, kurioje yra tarpų, turite juos pridėti:

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

Hmm .. tai nėra klaida, bet funkcija ... Kad išvengtumėte bandymo sukurti „bash !" , Galite:

 a+=(one word "hello world"! 'hello world!' $'hello world\041') declare -pa declare -aa='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="h ello world!" [6]="hello world!")' 

printf : atkurkite kintamąjį naudodami integruotą komandą

printf suteikia galingą būdą piešti eilutės formatą. Kadangi tai yra įmontuota „Bash“ funkcija, galima pakeisti formatuotą eilutę į kintamąjį, o ne spausdinti į standartinį stdout :

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

Šioje eilutėje yra septynios eilutės. Taigi, galime sukurti formatuojamą eilutę, kurioje yra tiksliai septyni pozicijos argumentai:

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

Arba galėtume naudoti vieną argumentų formato eilutę, kuri bus pakartota tiek, kiek argumentų, kaip ...

Atkreipkite dėmesį, kad mūsų a vis dar yra masyvas! Pakeistas tik pirmasis elementas!

 declare -pa declare -aa='([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!")' 

Baze, kai nurodote kintamojo pavadinimą nenurodydami indekso, visada nurodykite tik pirmąjį elementą!

Taigi, norėdami gauti septynių laukų masyvą, turime tik iš naujo įdiegti 1 elementą:

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

Vienas argumentų eilutė su daugeliu argumentų:

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

Naudoti klausimų sintaksę:

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

Pastaba: dvigubų kabučių naudojimas gali būti naudingas dirbant su newlines , kuriose yra spaces , tabulations ir (arba) newlines

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

Shell dabar

Jūs negalite naudoti „bashism“ POSIX apvalkale, todėl nėra integruoto printf .

Iš esmės

Bet jūs galite tiesiog padaryti:

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

Suformatuotas naudojant šakotą printf

Jei norite naudoti sudėtingesnes konstrukcijas, turite naudoti šakutę (naują vaiko procesą, kuris atlieka užduotį ir grąžina rezultatą per stdout ):

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

Istoriškai galite naudoti atgalines nuorodas, kad gautumėte šakutės rezultatą:

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

Tačiau tai nėra lengva pridėti:

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

su backslashes, turėtumėte vengti vidinių šakių su nuleidžiais sluoksniais:

 foo="Today is: " foo='printf "%s %s" "$foo" "\'date\'"' echo $foo Today is: Sun Aug 4 11:59:10 CEST 2013 
869
04 авг. F. Hauri atsakymas 04 rug. 2013-08-04 13:04 '13, 13:04 2013-08-04 13:04

Taip pat galite tai padaryti:

 $ var="myscript" $ echo $var myscript $ var=${var}.sh $ echo $var myscript.sh 
121
28 окт. atsakymas, kurį pateikė userend 28 spalis. 2011-10-28 06:09 '11 at 6:09 2011-10-28 06:09
 bla=hello laber=kthx echo "${bla}ohai${laber}bye" 

Bus išvestis

 helloohaikthxbye 

Tai naudinga, kai $blaohai sukelia kintamą klaidą. Arba, jei jūsų eilutėse yra tarpų ar kitų specialių simbolių. "${foo}" teisingai ekranuoja viską, ką įdėjote į jį.

114
25 июля '13 в 18:48 2013-07-25 18:48 atsakymas pateikiamas orkodenui liepos 25 d., 13 val., 6:48, 2013-07-25 18:48
 foo="Hello " foo="$foo World" 

40
15 нояб. atsakymas pateikiamas vinotkr 15 nov. 2010-11-15 08:44 '10 8:44 2010-11-15 08:44

Kaip aš išsprendžiau problemą

 $a$b 

Pavyzdžiui

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

kuri gamina

 Hello World 

Jei bandote sujungti eilutę su kita eilute, pvz.,

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

tada bus echo "$c"

 Hello World 

su papildoma erdve.

 $aWorld 

neveikia, kaip galite įsivaizduoti, bet

 ${a}World 

gamina

 HelloWorld 
32
07 марта '14 в 19:43 2014-03-07 19:43 Atsakymą pateikė Chris Smith kovo 7 d. 14 d. 19:43 2014-03-07 19:43
 $ a=hip $ b=hop $ ab=$a$b $ echo $ab hiphop $ echo $a$b hiphop 
26
15 нояб. atsakymas tebėra neišspręstas 15 nov. 2010-11-15 08:42 '10 8:42 2010-11-15 08:42

Jei norite pridėti kažką panašaus į pabraukimą, naudokite \ t

 FILEPATH=/opt/myfile 

Jis neveikia:

 echo $FILEPATH_$DATEX 

Tai puikiai veikia:

 echo $FILEPATH\\_$DATEX 
20
20 сент. Atsakymą pateikė vartotojo2800471 20 sep . 2013-09-20 22:15 '13, 10:15 pm 2013-09-20 22:15

Kitas metodas ...

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

... ir dar vienas.

 > H="Hello " > U=$H"universe." > echo $U Hello universe. 
19
18 марта '13 в 11:24 2013-03-18 11:24 atsakymas į Akseli Palén'ą pateikiamas kovo 13 d. 13 val. 11:24 2013-03-18 11:24

Čia pateikiama trumpa, ką sako dauguma atsakymų.

Tarkime, mes turime du kintamuosius:

 a=hello b=world 

Žemiau esančioje lentelėje paaiškinami skirtingi kontekstai, kuriuose galime sujungti a ir b reikšmes, kad sukurtume naują c .

18
06 дек. Atsakymas pateikiamas koduotojo 06 dec. 2017-12-06 07:04 '17 at 7:04 2017-12-06 07:04

Galite prisijungti be kabučių. Štai pavyzdys:

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

Šis paskutinis pareiškimas spausdins „OpenSystems“ (be kabučių).

Tai yra „bash“ scenarijaus pavyzdys:

 v1=hello v2=world v3="$v1 $v2" echo $v3 # Output: hello world echo "$v3" # Output: hello world 
15
15 нояб. atsakymas pateikiamas mariana soffer 15 nov. 2010-11-15 10:40 '10 10:40 2010-11-15 10:40

Paprasčiausias būdas su kabučių:

 B=Bar b=bar var="$B""$b""a" echo "Hello ""$var" 
15
21 дек. atsakymą pateikė betontalpfa 21 d. 2016-12-21 18:23 '16 at 18:23 2016-12-21 18:23

Net jei operatorius dabar yra leidžiamas, jis buvo įvestas 2004 m. Bash 3.1 .

Bet koks scenarijus, naudojant šį pareiškimą senesnėse „Bash“ versijose, baigsis klaidos „komanda nerastas“, jei esate laimingas, arba „sintaksės klaida šalia netikėto žetono“.

Tiems, kurie rūpinasi atgaliniu suderinamumu, laikykitės senesnių standartinių „Bash“ kodavimo metodų, panašių į pasirinkto atsakymo metodus:

 foo="Hello" foo="$foo World" echo $foo > Hello World 
14
04 нояб. Louis-Félix atsakymas 04 lapkričio. 2014-11-04 22:57 '14 ne 10:57 AM 2014-11-04 22:57

Norėčiau išplėsti kintamąjį eilutėje:

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

Stumdomieji skliausteliai atitinka nuolatinį eilutės naudojimą:

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

Priešingu atveju, naudojant foo = "$fooWorld" neveiks.

13
14 июня '17 в 8:35 2017-06-14 08:35 atsakymą davė Nick Tsai birželio 17 d. 17 val. 8:35 2017-06-14 08:35

Saugus būdas:

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

Linijos, kuriose yra tarpų, gali tapti komandos dalimi, naudodami „$ XXX“ ir „$ {XXX}“, kad būtų išvengta šių klaidų.

Plius žr. Kitą atsakymą apie + =

7
27 февр. atsakymą pateikė Bohdan 27 vasario mėn. 2014-02-27 02:39 '14 at 2:39 2014-02-27 02:39

Jei bandote suskirstyti eilutę į kelias eilutes, galite naudoti nugaros brūkšnį:

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

Tarp vienos vietos:

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

Jis taip pat prideda tik vieną tarpą tarp:

 $ a="hello \ > world" $ echo $a hello world 
6
04 апр. jcarballo atsakymas 04 Bal 2012-04-04 02:22 '12 at 2:22 2012-04-04 02:22

Štai vienas konkretus atvejis, kai turėtumėte rūpintis:

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

Kaip galbūt danielsan išspausdinti "daniel"san danielsan "daniel"san , ne danielsan . Tokiu atveju turėtumėte atlikti šiuos veiksmus:

 user=daniel cat > output.file << EOF ${user}san EOF 
6
28 окт. atsakymas diogovk 28 spalis. 2015-10-28 20:35 '15 ne 20:35 2015-10-28 20:35

Jei tai yra pavyzdys, kaip pridėti " World" į pradinę eilutę, tai gali būti:

 #!/bin/bash foo="Hello" foo=$foo" World" echo $foo 

Išeiti:

 Hello World 
5
24 апр. Atsakymas pateiktas 太極 者 無極 而 而 24 Bal. 2015-04-24 08:07 '15, 08:07 2015-04-24 08:07
 var1='hello' var2='world' var3=$var1" "$var2 echo $var3 
5
07 февр. Atsakymas suteiktas 07 vasario 7 d. 2017-02-07 11:50 '17 at 11:50 2017-02-07 11:50

Aš norėjau sukurti eilutę iš sąrašo. Negalėjau rasti atsakymo į šį klausimą, todėl paskelbiau čia. Štai ką aš padariau:

 list=(1 2 3 4 5) string='' for elm in "${list[@]}"; do string="${string} ${elm}" done echo ${string} 

ir tada gaunu šią išvestį:

 1 2 3 4 5 
4
21 окт. Simon Bachmann atsakymas, pateiktas spalio 21 d 2018-10-21 13:06 '18, 01:06 pm 2018-10-21 13:06

Susirūpinimą kelia našumas, tačiau duomenų nėra. Leiskite pasiūlyti paprastą testą.

(PASTABA: date „MacOS“ negauna nanosekundžių, todėl tai turi būti daroma „Linux“.)

„GitHub“ sukūriau „ append_test.sh“ su turiniu:

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

 $ ./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 bandymas:

 $ ./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 

Klaidos rodo, kad mano „Bash“ pasiekė 335.54432 MB prieš sudužus. Galite pakeisti kodą nuo duomenų padvigubinimo, kad pridėtumėte pastovią, kad gautumėte granuliuotą grafiką ir nesėkmę. Bet manau, kad tai turėtų suteikti jums pakankamai informacijos, kad nuspręstumėte, ar jums rūpi. Asmeniškai, mažiau nei 100 MB, aš ne. Jūsų rida gali skirtis.

3
19 дек. Atsakymą Bruno Bronosky pateikė gruodžio 19 d. 2017-12-19 02:56 '17 at 2:56 2017-12-19 02:56

Atkreipkite dėmesį, kad tai neveiks.

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

nes atrodo, kad jis nukrenta $ foo ir palieka jus su:

PREFIX_WORLD

bet jis veiks:

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

ir jūs gaunate teisingą išvadą:

PREFIX_HELLO_WORLD

2
30 дек. Atsakymas pateikiamas Dss 30 d. 2013-12-30 23:23 '14, 23:23, 2013-12-30 23:23

Čia yra vienas iš „ awk“ :

 $ foo="Hello" $ foo=$(awk -v var=$foo 'BEGIN{print var" World"}') $ echo $foo Hello World 
1
24 авг. atsakymas suteikiamas Avinash Raj 24 rug. 2014-08-24 14:09 '14, 14:09, 2014-08-24 14:09

Aš tai padarysiu, kai tai patogu: naudokite integruotą komandą!

 echo "The current time is `date`" echo "Current User: `echo $USER`" 
1
10 янв. atsakymą pateikė Marty Jan 10 2014-01-10 03:26 '14 at 3:26 2014-01-10 03:26

Aš tai padaryti greitai.

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

Kitas būdas kačių odai. Šį kartą su funkcijomis: D

0
08 сент. Atsakymas pateikiamas CommaToast 08 Sep. 2014-09-08 10:44 '14, 10:44 2014-09-08 10:44

Aš dar nežinau apie PHP, bet ji veikia linux bash. Jei nenorite daryti įtakos kintamajam, galite išbandyti šiuos veiksmus:

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

Vietoj „Sveiki“ arba „!“ Galite įdėti kitą kintamąjį. Taip pat galite susieti daugiau linijų.

-1
07 марта '18 в 4:28 2018-03-07 04:28 atsakė Ayman Boubleh kovo 07-18 d. 4:28. 2018-03-07 04:28

Galite pabandyti tai padaryti toliau. Pakeitus pakaitalus, dvigubos kabutės turi tarpų.

 var1="Ram " var2="Lakshmana" echo $var1$var2 or echo var1+=$var2 "bash support += operation. bcsmc2rtese001 [/tmp]$ var1="Ram " bcsmc2rtese001 [/tmp]$ var2="Lakshmana" bcsmc2rtese001 [/tmp]$ echo $var1$var2 Ram Lakshmana bcsmc2rtese001 [/tmp]$ var1+=$var2 bcsmc2rtese001 [/tmp]$ echo $var1 Ram Lakshmana 
-4
15 мая '14 в 12:57 2014-05-15 12:57 atsakymą pateikė Ayyappa Boligala gegužės 15 d. 14 val. 12:57 2014-05-15 12:57