Dash dəyişənləri bash ilə necə birləşdirmək olar

PHP-də strings aşağıdakı kimi birləşdirilir:

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

Burada $foo "Hello World" olur.

Bəşdə bu necə əldə edilir?

1976
15 нояб. Çiyələyin qurulması 15 noyabr. 2010-11-15 08:38 '10 at 8:38 2010-11-15 08:38
@ 27 cavab
 foo="Hello" foo="$foo World" echo $foo > Hello World 

Ümumiyyətlə, iki dəyişən birləşdirmək üçün onları tək-tək yaza bilərsiniz:

 a='hello' b='world' c=$a$b echo $c > helloworld 
2672
15 нояб. codaddict cavab 15 noyabr. 2010-11-15 08:41 '10 saat 08:41 'da 2010-11-15 08:41

Bash həmçinin aşağıdakı kodlaşdırmada göstərildiyi kimi + = operatoru dəstəkləyir:

border=0
 $ A="XY" $ A+="Z" $ echo "$A" X YZ 
885
15 нояб. Cavab 15 noyabrda thkala verilir. 2010-11-15 11:33 '10 at 11:33 2010-11-15 11:33

İlk baş

Bu sual xüsusilə Bəş üçün olduğundan, cavabın ilk hissəsi bunu düzgün şəkildə yerinə yetirmək üçün müxtəlif üsullar təqdim edəcəkdir:

+= : dəyişənliyə əlavə edin

Sintaksis += müxtəlif yollarla istifadə edilə bilər:

var+=... əlavə et var+=...

(Mən təvazökar olduğumdan bəri yalnız fooa iki dəyişəndən istifadə edəcəyəm və sonra onları cavab olaraq təkrar istifadə edəcəyəm);)

 a=2 a+=4 echo $a 24 

Yığın daşqın problemi sintaksisindən istifadə

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

böyük işlər!

Tam sayıya əlavə edin ((var+=...))

dəyişən a simli deyil, eyni zamanda bir tamsayıdır

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

Array əlavə et var+=(...)

Bizim də yalnız bir elementin bir sıra.

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

Bir boşluqla ayrılmış parantezlər arasında bir sıra olduğunu unutmayın. Serialınızdakı boşluqları olan bir simli saxlamaq istəyirsinizsə, onları əlavə etməlisiniz:

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

Hmm .. bu bir səhv deyil, bir funksiyadır ... Başın işə düşməməsini istəmirəm !" Deyə bilərsən:

 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 : yerin komutunu istifadə edərək, dəyişənləri yenidən qurun

printf komanda inline simli format yaratmaq üçün güclü bir yol təqdim edir. Daxili bash olduğundan stdout çap etmək əvəzinə bir dəyişənə formatlaşdırılmış simli göndərmək imkanı var:

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

Bu dizidəki yeddi xətt var. Beləliklə, tam olaraq yeddi mövqe arqumentini ehtiva edən formatlanmış bir simli qura bilərik:

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

Və ya keçmiş arqumentlərin sayı ilə təkrarlayacaq tək bir dəlil formatı simli istifadə edə ...

Xatırladaq ki, bizim a hələ də bir sıra! Yalnız ilk maddə dəyişdi!

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

Başda, bir index göstərmədən dəyişən adı daxil edərkən, həmişə yalnız ilk elementə müraciət edirsiniz!

Yəni, yedi ardıcıl sahələri almaq üçün yalnız 1 elementi yenidən bərpa etməliyik:

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

Bir arqument format ardıcıllığı ilə bir çox arqumentlə keçdi:

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

Yığıt Taşma Sorusunun Sintaksisindən istifadə

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

Nota: ikiqat tirnoqlardan istifadə spaces , tabulations və / və ya newlines olan simləri manipulyasiya etmək üçün faydalı ola bilər

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

Artıq qabıq

POSIX qabığında, bazaları istifadə edə bilməzsiniz, belə ki, heç bir daxili printf .

Əsasən

Amma yalnız edə bilərsən:

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

Forked printf formatında istifadə formatlanmışdır

Daha mürəkkəb konstruksiyalardan istifadə etmək istəyirsinizsə, fork (vəzifəni yerinə yetirən və nəticəni stdout vasitəsilə qaytaran yeni bir uşaq prosesi) istifadə stdout :

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

Tarixi olaraq, nəticə çəngəllərini almaq üçün geri istifadə edə bilərsiniz:

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

Lakin yuva üçün asan deyil:

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

arxa pəncərələrlə, arxa çənlərin iç çəngəllərindən qaçmaq lazımdır:

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

Bunu da edə bilərsiniz:

 $ var="myscript" $ echo $var myscript $ var=${var}.sh $ echo $var myscript.sh 
112
28 окт. Cavab verildi user Oct 28. 2011-10-28 06:09 '11 at 6:09 2011-10-28 06:09
 bla=hello laber=kthx echo "${bla}ohai${laber}bye" 

Çıxacaq

 helloohaikthxbye 

$blaohai dəyişən bir səhv nəticəsində nəticə tapılmadıqda faydalıdır. Və ya xəttləriniz boşluqlar və ya digər xüsusi simvollar varsa. "${foo}" daxil etdiyiniz hər şeyi düzgün şəkildə ekranlaşdırır.

94
25 июля '13 в 18:48 2013-07-25 18:48 cavab iyul ayının 25-də, saat 13: 00 -da orkodenə verilir 2013-07-25 18:48
 foo="Hello " foo="$foo World" 

33
15 нояб. cavab vinothkr 15 nov tərəfindən verilir . 2010-11-15 08:44 '10 at 8:44 2010-11-15 08:44

Problemi necə həll etdim, sadəcə

 $a$b 

Məsələn,

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

hansı istehsal edir

 Hello World 

Bir simli başqa simli ilə birləşdirməyə çalışarsanız, məsələn,

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

sonra echo "$c"

 Hello World 

əlavə yer.

 $aWorld 

təsəvvür edə bilərsiniz kimi işləmir

 ${a}World 

istehsal edir

 HelloWorld 
28
07 марта '14 в 19:43 2014-03-07 19:43 Cavab Chris Smith tərəfindən 07 Mart 'da 19:43' da veriləcək 2014-03-07 19:43
 $ a=hip $ b=hop $ ab=$a$b $ echo $ab hiphop $ echo $a$b hiphop 
19
15 нояб. cavab 15 qətidir . 2010-11-15 08:42 '10 at 8:42 2010-11-15 08:42

Digər bir yanaşma ...

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

... və bir daha.

 > H="Hello " > U=$H"universe." > echo $U Hello universe. 
17
18 марта '13 в 11:24 2013-03-18 11:24 Cavab 18 Mart 2013 tarixində saat 11:24 'Akseli Palenə verildi

Bir alt çizgi kimi bir şey əlavə etmək istəyirsinizsə, qaçışdan istifadə edin (\)

 FILEPATH=/opt/myfile 

İşə yaramır:

 echo $FILEPATH_$DATEX 

Bu gözəl işləyir:

 echo $FILEPATH\\_$DATEX 
17
20 сент. Cavab 20 sentyabrda user2800471 tərəfindən verilir . 2013-09-20 22:15 '13 saat 10:15 'da 2013-09-20 22:15

Siz kotirovka olmadan qoşula bilərsiniz. Burada bir nümunə:

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

Bu son bəyanat "OpenSystems" yazılacaq (kotirovkalar olmadan).

Bu bas skriptinin nümunəsidir:

 v1=hello v2=world v3="$v1 $v2" echo $v3 # Output: hello world echo "$v3" # Output: hello world 
12
15 нояб. Cavab mariana soffer 15 noyabr verilir. 2010-11-15 10:40 '10 10:40 'da 2010-11-15 10:40

+ = Operatora icazə verilsə belə, 2004-cü ildə Bash 3.1 -də təqdim olunmuşdur.

Bəşin köhnə versiyalarında bu bəyanatı istifadə edən hər hansı bir skript, şanslıysanız və ya "gözlənilməz bir mö'cünün yanında sintaksis səhvini" tapdıqda "komanda tapılmadı" bir səhv ilə başa çatacaq.

Qarşılıqlı uyğunluq barədə qayğıkeş olanlar üçün, seçilmiş cavabdakılara bənzəyən daha əvvəlki standart Baş kontsentasiya metodlarına sadiq qalın:

 foo="Hello" foo="$foo World" echo $foo > Hello World 
11
04 нояб. Louis-Félix tərəfindən 04 Noyabr. 2014-11-04 22:57 '14 saat 10:57 AM 2014-11-04 22:57

Dəyişənləri simvolda genişləndirmək üçün ${} curly brackets ${} istifadə etməyi üstün edirəm:

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

Sürgülü mötərizələr dizəyin davamlı istifadəsinə cavab verəcəkdir:

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

Əks halda, foo = "$fooWorld" istifadə edərək işləməyəcək.

9
14 июня '17 в 8:35 2017-06-14 08:35 Cavab Nick Tsai tərəfindən 14 iyun '17' də 8:35 2017-06-14 08:35 'də verilir

Aşağıda əksər cavabların nə olduğunu qısa bir şərh edir.

İki dəyişən var deyirik:

 a=hello b=world 

Aşağıdakı cədvəldə yeni bir dəyişən c yaratmaq üçün ab dəyərlərini birləşdirə biləcəyimiz müxtəlif kontekstlər təsvir edilir.

BashFAQ / 013 - Necə iki dəyişən birləşdirmək olar? 
  • Shell dəyişənləri ətrafında qələmlər lazımdır?
  • 9
    06 дек. Cavab codeforester 06 dekabrda verilir. 2017-12-06 07:04 '17 də 7:04 2017-12-06 07:04

    Təhlükəsiz yol:

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

    Bu boşluqlardan qaçmaq üçün boşluqları olan sətirlər əmrin bir hissəsi ola bilər, "$ XXX" və "$ {XXX}" istifadə edin.

    + + Haqqında başqa bir cavab gör

    6
    27 февр. Cavab 27 Fevral Bohdan tərəfindən verilir 2014-02-27 02:39 '14 at 2:39 2014-02-27 02:39

    Burada diqqətli olmalısınız bir xüsusi vəziyyətdir:

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

    danielsan , danielsan deyil, "daniel"san danielsan . Bu halda, aşağıdakıları etməlisiniz:

     user=daniel cat > output.file << EOF ${user}san EOF 
    6
    28 окт. Cavab diogovk Oct 28 verildi . 2015-10-28 20:35 '15 saat 20:35 'də 2015-10-28 20:35
     var1='hello' var2='world' var3=$var1" "$var2 echo $var3 
    5
    07 февр. Cavab 07 fevral tarixində verilir. 2017-02-07 11:50 '17 də 11:50 2017-02-07 11:50

    Quotes ilə ən asan yol:

     B=Bar b=bar var="$B""$b""a" echo "Hello ""$var" 
    5
    21 дек. cavab betontalpfa tərəfindən verilir 21 dekabr . 2016-12-21 18:23 '16 at 18:23 2016-12-21 18:23

    Bir xəttin bir neçə xəttə bölünməsinə çalışırsınızsa, bir terslikdən istifadə edə bilərsiniz:

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

    Arasında bir boşluq:

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

    Bu da aralarında yalnız bir məkanı əlavə edir:

     $ a="hello \ > world" $ echo $a hello world 
    5
    04 апр. jcarballo tərəfindən verilmiş cavab 04 Apr 2012-04-04 02:22 '12 at 2:22 2012-04-04 02:22

    Bu, orijinal simliya " World" əlavə etmək nümunəsidirsə, bu ola bilər:

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

    Çıxış:

     Hello World 
    4
    24 апр. Cavab verilir 太極 者 無極 而 生 24 Apr 2015-04-24 08:07 '15 at 8:07 'də 2015-04-24 08:07

    Xahiş edirik unutmayın ki, bu işləməyəcək.

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

    çünki $ foo-nu buraxmağı və tərk etməyi düşünürəm:

    PREFIX_WORLD

    lakin işləyəcək:

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

    və doğru nəticə əldə edirsiniz:

    PREFIX_HELLO_WORLD

    3
    30 дек. Cavab Dss verildi 30 dekabr. 2013-12-30 23:23 '14 da 23:23 2013-12-30 23:23

    Burada awk biri:

     $ foo="Hello" $ foo=$(awk -v var=$foo 'BEGIN{print var" World"}') $ echo $foo Hello World 
    2
    24 авг. Cavab verilir Avinash Raj 24 aug. 2014-08-24 14:09 '14 at 14:09 2014-08-24 14:09

    Mən rahat olduqda bunu edirəm: Daxili komandanlığı istifadə edin!

     echo "The current time is `date`" echo "Current User: `echo $USER`" 
    2
    10 янв. Cavab Marty Jan 10 tərəfindən verilir 2014-01-10 03:26 '14 at 3:26 2014-01-10 03:26

    Performansa dair narahatlıqlar var, lakin məlumatlar təklif edilmir. Mənə sadə bir test təklif edək.

    (Qeyd: MacOS date nanosaniyalar təklif edilmir, buna görə Linux-da edilməlidir.)

    İçindəkiləri ilə GitHub üzrə append_test.sh yaratdım :

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

    Test 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 

    Test 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 

    Səhvlər mənim Bash 335.54432 MB çatdı əvvəl göstərir. Verilənləri ikiqat gətirmək üçün kodu daha qüsursuz bir grafik və uğursuzluq nöqtəsi əldə etmək üçün daimi əlavə etmək üçün dəyişə bilərsiniz. Amma düşünürəm ki, bu, sizə qayğı göstərməyiniz üçün kifayət qədər məlumat verməlidir. Şəxsən, 100 MB-dən aşağı deyiləm. Kilometriniz dəyişə bilər.

    2
    19 дек. Cavab Bruno Bronosky tərəfindən 19 dekabrda verilir . 2017-12-19 02:56 '17 də 2:56 2017-12-19 02:56

    Mən bunu tez bir şəkildə aparıram.

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

    Dəri üçün bir pişik başqa bir yol. Bu zaman funksiyaları ilə: D

    1
    08 сент. Cavab CommaToast 08 Sep verilir. 2014-09-08 10:44 '14 da 10:44 2014-09-08 10:44

    Mən hələ PHP haqqında bilmirəm, amma linux bash-da işləyir. Bir dəyişənə təsir etmək istəmirsinizsə, aşağıdakıları cəhd edə bilərsiniz:

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

    "Hello" və ya "!" Əvəzinə başqa bir dəyişən əlavə edə bilərsiniz. Ayrıca daha çox xətti birləşdirə bilərsiniz.

    0
    07 марта '18 в 4:28 2018-03-07 04:28 Ayman Boubleh'a 07.03 'də 04:28' də cavab olaraq cavab verdi . 2018-03-07 04:28

    Aşağıda bunu etməyə cəhd edə bilərsiniz. Əvəzləşmə baş verdikdə ikiqat qiymətlər boşluqlar içərisindədir.

     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 
    -2
    15 мая '14 в 12:57 2014-05-15 12:57 cavab Ayyappa Boligala tərəfindən 15 may 'da saat 12:57' də verilir 2014-05-15 12:57

    etiketləri ilə bağlı digər suallar və ya bir sual soruşun