Bash'de string de─či┼čkenleri nas─▒l birle┼čtiririm


Al─▒nan cevaba git


PHP'de dizeler a┼ča─č─▒daki ┼čekilde birle┼čtirilir:

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

─░┼čte, $foo "Merhaba D├╝nya" olur.

Bash'de bu nas─▒l ba┼čar─▒l─▒r?


2578









Cevap say─▒s─▒n─▒ say: 30






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

Genel olarak iki de─či┼čkeni birle┼čtirmek i├žin bunlar─▒ birbiri ard─▒na yazabilirsiniz:

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

3482







Bash += , bu kodda g├Âsterildi─či gibi bir operat├Âr├╝ de destekler :

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

1067







├ľnce bash

Bu soru ├Âzellikle Bash'e dayand─▒─č─▒ndan , cevab─▒n ilk k─▒sm─▒ bunu do─čru yapman─▒n farkl─▒ yollar─▒n─▒ sunar:

+= : De─či┼čkene ekle

S├Âzdizimi += farkl─▒ ┼čekillerde kullan─▒labilir:

Dizeye ekle var+=...

Ben tutumlu oldu─čum i├žin (ben sadece iki de─či┼čken kullanaca─č─▒z foo ve a ard─▒ndan t├╝m yan─▒t─▒nda ayn─▒ tekrar kullanabilirsiniz. ;-)

 a=2
a+=4
echo $a
24
 

Y─▒─č─▒n Ta┼čmas─▒ soru s├Âzdizimini kullanarak ,

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

iyi ├žal─▒┼č─▒yor!

Bir tam say─▒ya ekle ((var+=...))

de─či┼čken a bir dizedir, ancak ayn─▒ zamanda bir tam say─▒d─▒r

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

Diziye ekle var+=(...)

Bizim a de tek bir element dizisidir.

 echo ${a[@]}
36

a+=(18)

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

Parantezler aras─▒nda bo┼člukla ayr─▒lm─▒┼č bir dizi oldu─čunu unutmay─▒n . Dizinizde bo┼čluk i├žeren bir dize saklamak istiyorsan─▒z, bunlar─▒ i├žine alman─▒z gerekir:

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

Hmm .. bu bir hata de─čil, bir ├Âzellik ... Bash'─▒n geli┼čmesini denemek i├žin !" ┼čunlar─▒ yapabilirsiniz:

 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 : Yerle┼čik komutu kullanarak de─či┼čkeni yeniden olu┼čturun

printf Yerle┼čik komut dizesi bi├žimi ├žizim g├╝├žl├╝ bir yol sunar. Bu bir Bash yerle┼čik oldu─čundan, ├╝zerine bas─▒lmak yerine bir de─či┼čkene bi├žimlendirilmi┼č dize g├Ânderme se├žene─či vard─▒r stdout :

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

Yedi vard─▒r dizeleri bu dizide. B├Âylece tam olarak yedi konumsal arg├╝man i├žeren bi├žimlendirilmi┼č bir dize olu┼čturabiliriz:

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

Ya da bir arg├╝man format dizgisi kullanabiliriz, ki bu bir├žok arg├╝man sundu ...

Bizim a bir dizimizin hala bir dizi oldu─čunu unutmay─▒n ! Sadece ilk eleman de─či┼čti!

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

Bash alt─▒nda, dizin belirtmeden bir de─či┼čken ismine eri┼čti─činizde, her zaman sadece ilk eleman─▒ ele al─▒rs─▒n─▒z!

Bu y├╝zden yedi alan dizimizi geri almak i├žin sadece 1. elementi yeniden ayarlamam─▒z gerekir:

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

Bir arg├╝man format dizgisi bir├žok arg├╝manla iletildi:

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

Y─▒─č─▒n Ta┼čmas─▒ soru s├Âzdizimini kullanarak :

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

Nota: kullan─▒m─▒ ├žift t─▒rnak i├žerirler dizeleri i┼čleme i├žin yararl─▒ olabilir spaces , tabulations ve / veya newlines

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

┼×imdi kabuk

POSIX kabu─čunun alt─▒nda , temelleri kullanamazs─▒n─▒z , bu nedenle yerle┼čik yoktur printf .

temel olarak

Ama basit├že yapabilirsin:

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

Bi├žimlendirilmi┼č, kullanarak ├žatall─▒ printf

Daha karma┼č─▒k yap─▒lar kullanmak istiyorsan─▒z, bir ├žatal kullanman─▒z gerekir (i┼či yapan ve sonucu d├Ând├╝ren yeni ├žocuk i┼člemi stdout ):

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

Tarihsel olarak, bir ├žatal─▒n sonucunu almak i├žin geri tepmeler kullanabilirsiniz :

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

Ancak bu yuvalama i├žin kolay de─čildir :

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

geri tepme ├žubuklar─▒ ile i├ž ├žatallardan ters e─čik ├žizgilerden ka├žman─▒z gerekir :

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

919







Bunu da yapabilirsiniz:

 $ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh
 

132







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

Çıktı olacak

 helloohaikthxbye
 

Bu, $blaohai bir hata bulunamad─▒─č─▒nda bir de─či┼čkene yol a├žt─▒─č─▒nda kullan─▒┼čl─▒d─▒r . Veya dizelerinizde bo┼čluk veya ba┼čka ├Âzel karakterler varsa. "${foo}" i├žine koymak herhangi bir ┼čey d├╝zg├╝n ka├žar.


117







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

     


44







Sorunu ├ž├Âzece─čim yol sadece

 $a$b
 

├ľrne─čin,

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

hangi ├╝retir

 Hello World
 

Bir dizeyi ba┼čka bir dizeyle birle┼čtirmeye ├žal─▒┼č─▒rsan─▒z, ├Ârne─čin

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

sonra echo "$c" ├╝retecek

 Hello World
 

fazladan bir bo┼člukla.

 $aWorld
 

├žal─▒┼čma, tahmin edebilece─činiz gibi

 ${a}World
 

├╝retir

 HelloWorld
 

32







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

29







─░┼čte ├žo─ču cevaplar─▒n neden bahsetti─činin k─▒sa bir ├Âzeti.

─░ki de─či┼čkenimiz oldu─čunu ve $ 1 'bir' olarak ayarland─▒─č─▒n─▒ varsayal─▒m:

 set one two
a=hello
b=world
 

A┼ča─č─▒daki tablo, de─čerlerini birle┼čtirebilece─čimiz a ve b yeni bir de─či┼čken yaratabilece─čimiz farkl─▒ ba─člamlar─▒ a├ž─▒klar 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
 

Birka├ž not:

  • Bir ataman─▒n RHS'sini ├žift t─▒rnak i├žine almak, genellikle iyi bir uygulamad─▒r, ancak ├žo─ču durumda olduk├ža iste─če ba─čl─▒d─▒r.
  • += B├╝y├╝k bir dize k├╝├ž├╝k art─▒┼člarla, ├Âzellikle bir d├Âng├╝de olu┼čturulmu┼čsa, performans a├ž─▒s─▒ndan daha iyidir.
  • {} geni┼člemelerini belirsizle┼čtirmek i├žin de─či┼čken adlar─▒n─▒n ├ževresinde kullan─▒n (yukar─▒daki tabloda 2. sat─▒rda oldu─ču gibi). Sat─▒r 3 ve 4'te g├Âr├╝ld├╝─č├╝ gibi, {} de─či┼čken de─či┼čken, kabuk de─či┼čken ad─▒nda ge├žerli bir ilk karakter olan karakterle ba┼člayan, yani alfabe veya alt ├žizgi olan bir dizeyle birle┼čtirilmedik├že gerek yoktur .

Ayr─▒ca bak─▒n─▒z:


23







Alt ├žizgi gibi bir ┼čey eklemek istiyorsan─▒z, escape (\) kullan─▒n.

 FILEPATH=/opt/myfile
 

Bu mu de─čil ├žal─▒┼č─▒r:

 echo $FILEPATH_$DATEX
 

Bu iyi ├žal─▒┼č─▒yor:

 echo $FILEPATH\\_$DATEX
 

20







Yine ba┼čka bir yakla┼č─▒m ...

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

... ve bir tane daha.

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

19







T─▒rnaklar olmadan birle┼čtirebilirsiniz. ─░┼čte bir ├Ârnek:

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

Bu son ifade "OpenSystems" (t─▒rnak i┼čaretleri olmadan) basacakt─▒r.

Bu bir Bash beti─činin bir ├Ârne─či:

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

15







+ = Operat├Âr├╝ne ┼čimdi izin verilse bile, 2004'te Bash 3.1'de tan─▒t─▒ld─▒ .

Bu i┼čleci eski Bash s├╝r├╝mlerinde kullanan herhangi bir komut dosyas─▒, ┼čansl─▒ysan─▒z "komut bulunamad─▒" hatas─▒ veya "beklenmeyen belirteci yak─▒n─▒nda" s├Âzdizimi hatas─▒ "ile ba┼čar─▒s─▒z olur.

Geriye d├Ân├╝k uyumluluk umurunda olanlar i├žin, se├žilen cevapta belirtilenler gibi eski standart Bash birle┼čtirme y├Ântemlerine uyun:

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

15







T─▒rnak i┼čareti i├žeren en basit yol:

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

15







${} Dize de─či┼čkenini geni┼čletmek i├žin k├╝me parantezleri kullanmay─▒ tercih ederim :

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

K─▒vr─▒ml─▒ parantez S├╝rekli dizi kullan─▒m─▒na uyacakt─▒r:

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

Aksi halde foo = "$fooWorld" kullan─▒m i┼če yaramayacakt─▒r.


13







Ne yapmaya ├žal─▒┼č─▒yorsun ise b├Âl├╝nm├╝┼č birka├ž sat─▒r i├žine bir dize, bir ters e─čik ├žizgi kullanabilirsiniz:

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

Arada bir bo┼člukla:

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

Bu, ayr─▒ca ┼čunlara yaln─▒zca bir bo┼čluk ekler:

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

8







Daha g├╝venli yol:

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

Bo┼čluk i├žeren dizeler komutun bir par├žas─▒ olabilir, bu hatalar─▒ ├Ânlemek i├žin "$ XXX" ve "$ {XXX}" tu┼člar─▒n─▒ kullan─▒n.

Ayr─▒ca + = hakk─▒ndaki di─čer cevaba bir g├Âz at─▒n


7







Dikkat etmeniz gereken belirli bir durum var:

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

─░stedi─činiz gibi ├ž─▒kt─▒ "daniel"san ve olacakt─▒r danielsan . Bu durumda yerine yapmal─▒s─▒n─▒z:

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

7







" World" Orijinal dizgiye ekleme ├Ârne─činizmi┼čse, a┼ča─č─▒daki olabilir:

 #!/bin/bash

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

Çıktı:

 Hello World
 

5







 var1='hello'
var2='world'
var3=$var1" "$var2 
echo $var3
 

5


2017-02-07





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

─░ki dizeyi bu ┼čekilde birle┼čtiriyorsunuz.


5







Performansla ilgili dile getirilen endi┼čeler var ancak veri sunulmuyor. Basit bir test ├Ânereyim.

(NOT: date macOS'ta nanosaniye sunmaz, bu y├╝zden Linux'ta yap─▒lmal─▒d─▒r.)

Ben olu┼čturduk GitHub'dan append_test.sh i├žeri─či ile:

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

Hatalar Bash'in d├╝┼čmeden ├Ânce 335.54432 MB'a ula┼čt─▒─č─▒n─▒ g├Âsteriyor . Sen de─či┼čebilir kodu daha par├žal─▒ bir grafik ve ba┼čar─▒s─▒zl─▒k noktas─▒n─▒ almak i├žin bir sabit ekleyerek veri iki kat─▒na gelen. Ama bunun umrunda olup olmad─▒─č─▒n─▒ karar vermek i├žin size yeterli bilgi vermesi gerekti─čini d├╝┼č├╝n├╝yorum. ┼×ahsen, 100 MB'─▒n alt─▒nda de─čilim. Kilometreniz de─či┼čebilir.


4







Bir listeden bir dize olu┼čturmak istedim. Bunun i├žin bir cevap bulamad─▒m bu y├╝zden buraya yaz─▒yorum. ─░┼čte yapt─▒─č─▒m ┼čey:

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

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

echo ${string}
 

ve sonra a┼ča─č─▒daki ├ž─▒kt─▒y─▒ al─▒yorum:

 1 2 3 4 5
 

4







Bunun i┼če yaramayaca─č─▒n─▒ unutmay─▒n.

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

G├Âr├╝n├╝┼če g├Âre $ foo d├╝┼č├╝yor ve sizi b─▒rak─▒yor:

PREFIX_WORLD

ama bu i┼če yarayacak:

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

ve sizi do─čru ├ž─▒kt─▒ya b─▒rak─▒n:

PREFIX_HELLO_WORLD


3


2013-12-30





Benim d├╝┼č├╝nceme g├Âre, iki dizgiyi birle┼čtirmenin en basit yolu, bunu sizin i├žin yapan bir i┼člev yazmak, sonra da bu i┼člevi kullanmakt─▒r.

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

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

foo="Super"
bar="man"

concat $foo $bar   # Superman

alien=$(concat $foo $bar)

echo $alien        # Superman
 

2







Uygun oldu─čunda bu ┼čekilde yap─▒yorum: Bir sat─▒r i├ži komut kullan─▒n!

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

1







─░┼čte AWK'den bir tanesi :

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

1







+= Birle┼čtirme i├žin ├Âzel operat├Âre ra─čmen, gitmenin basit bir yolu var:

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

├çift t─▒rnak, i├žindeki de─či┼čkenlerin yorumlanmas─▒ i├žin ekstra hesaplama s├╝resi al─▒r, m├╝mk├╝nse ka├ž─▒n─▒n.


0


2019-09-18





H─▒zl─▒ bir i┼člem yapmay─▒ seviyorum.

 #! /bin/sh -f
function combo() {
    echo [email protected]
}

echo $(combo 'foo''bar')
 

Bir kediyi cildin bir ba┼čka yolu. ─░┼člevlerle bu kez: D


-1







Hen├╝z PHP'yi bilmiyorum, ama bu Linux Bash'de ├žal─▒┼č─▒yor. Bir de─či┼čkeni etkilemek istemiyorsan─▒z, ┼čunu deneyebilirsiniz:

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

>Hello World!
 

'Merhaba' veya '!' Yerine ba┼čka bir de─či┼čken yerle┼čtirebilirsiniz. Siz de daha fazla dizgi birle┼čtirebilirsiniz.


-1