Pertanyaan Bagaimana menggabungkan variabel string dalam Bash


Dalam PHP, string digabungkan bersama sebagai berikut:

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

Sini, $foo menjadi "Hello World".

Bagaimana ini bisa dilakukan di Bash?


2095
2017-11-15 05:38


asal


Jawaban:


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

Secara umum untuk menggabungkan dua variabel Anda dapat menulisnya satu per satu:

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

2842
2017-11-15 05:41



Bash juga mendukung + = operator seperti yang ditunjukkan pada transkrip berikut:

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

933
2017-11-15 08:33



Bash dulu

Karena pertanyaan ini khusus untuk Pesta, bagian pertama dari jawaban saya akan menyajikan berbagai cara untuk melakukan ini dengan benar:

+=: Tambahkan ke variabel

Sintaksnya += dapat digunakan dengan berbagai cara:

Tambahkan ke string var+=...

(Karena saya hemat, saya hanya akan menggunakan dua variabel foo dan a dan kemudian gunakan kembali sama di seluruh jawaban. ;-)

a=2
a+=4
echo $a
24

Menggunakan Pertanyaan Stack Overflow sintaksis,

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

bekerja dengan baik!

Tambahkan ke bilangan bulat ((var+=...))

variabel a adalah string, tetapi juga sebuah integer

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

Tambahkan ke array var+=(...)

Kami a juga merupakan array dari hanya satu elemen.

echo ${a[@]}
36

a+=(18)

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

Perhatikan bahwa di antara tanda kurung, ada a array ruang terpisah. Jika Anda ingin menyimpan string yang berisi spasi di array Anda, Anda harus melampirkan mereka:

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

Hmm .. ini bukan bug, tetapi sebuah fitur... Untuk mencegah bash mencoba berkembang !", Anda bisa:

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: Buat kembali variabel menggunakan builtin perintah

Itu printf  builtin perintah memberi cara yang kuat untuk menggambar format string. Karena ini adalah Bash builtin, ada opsi untuk mengirim string yang diformat ke variabel, bukan pada pencetakan stdout:

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

Ada tujuh string dalam array ini. Jadi kita bisa membuat string yang diformulasikan yang mengandung tepat tujuh argumen posisional:

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

Atau kita bisa menggunakannya satu string format argumen yang akan diulang karena banyak argumen yang diajukan ...

Perhatikan bahwa kami a masih array! Hanya elemen pertama yang diubah!

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

Di bawah bash, ketika Anda mengakses nama variabel tanpa menentukan indeks, Anda selalu hanya membahas elemen pertama!

Jadi untuk mengambil tujuh susunan bidang kami, kami hanya perlu mengatur ulang elemen 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!")'

Satu string format argumen dengan banyak argumen yang dilewatkan ke:

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

Menggunakan Pertanyaan Stack Overflow sintaksis:

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

Nota: Penggunaan tanda kutip ganda semoga bermanfaat untuk memanipulasi string yang mengandung spaces, tabulations dan / atau newlines

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

Shell sekarang

Dibawah POSIX shell, Anda tidak bisa menggunakannya bashisms, jadi tidak ada builtin  printf.

Pada dasarnya

Tetapi Anda hanya bisa melakukan:

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

Diformat, menggunakan bercabang dua  printf

Jika Anda ingin menggunakan konstruksi yang lebih canggih, Anda harus menggunakan garpu (proses anak baru yang membuat pekerjaan dan mengembalikan hasilnya melalui stdout):

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

Secara historis, Anda bisa menggunakannya backticks untuk mengambil hasil dari garpu:

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

Tapi ini tidak mudah bersarang:

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

dengan backticks, Anda harus menghindari garpu bagian dalam dengan garis miring terbalik:

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

803
2017-08-04 10:04



Anda juga dapat melakukan ini:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

114
2017-10-28 03:09



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

Akan menghasilkan output

helloohaikthxbye

Ini berguna saat      $blaohai mengarah ke variabel tidak ditemukan kesalahan. Atau jika Anda memiliki spasi atau karakter khusus lainnya dalam string Anda. "${foo}" benar lolos apa pun yang Anda masukkan ke dalamnya.


103
2017-07-25 15:48



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


35
2017-11-15 05:44



Cara saya memecahkan masalahnya adalah adil

$a$b

Sebagai contoh,

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

yang menghasilkan

Hello World

Jika Anda mencoba menggabungkan string dengan string lain, misalnya,

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

kemudian echo "$c" akan menghasilkan

Hello World

dengan ruang ekstra.

$aWorld

tidak berfungsi, seperti yang Anda bayangkan, tetapi

${a}World

menghasilkan

HelloWorld

29
2018-03-07 16:43