Frage Wie verkette ich String-Variablen in Bash?


In PHP werden Strings wie folgt verkettet:

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

Hier, $foo wird "Hallo Welt".

Wie wird das in Bash erreicht?


2095
2017-11-15 05:38


Ursprung


Antworten:


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

Um zwei Variablen miteinander zu verketten, können Sie sie einfach nacheinander schreiben:

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

2842
2017-11-15 05:41



Bash unterstützt auch einen + = Operator, wie im folgenden Transkript gezeigt:

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

933
2017-11-15 08:33



Bash zuerst

Da steht diese Frage speziell für Bash, mein erster Teil der Antwort würde verschiedene Möglichkeiten zeigen, dies richtig zu machen:

+=: An Variable anhängen

Die Syntax += kann auf verschiedene Arten verwendet werden:

An Zeichenfolge anfügen var+=...

(Weil ich sparsam bin, werde ich nur zwei Variablen verwenden foo und a und dann dasselbe in der ganzen Antwort wiederverwenden. ;-)

a=2
a+=4
echo $a
24

Verwendung der Stapelüberlauffrage Syntax,

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

funktioniert gut!

An eine Ganzzahl anhängen ((var+=...))

Variable a ist eine Zeichenkette, aber auch eine ganze Zahl

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

An ein Array anhängen var+=(...)

Unser a ist auch eine Anordnung von nur einem Element.

echo ${a[@]}
36

a+=(18)

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

Beachten Sie, dass zwischen den Klammern a Leerzeichen getrennte Array. Wenn Sie eine Zeichenfolge mit Leerzeichen in Ihrem Array speichern möchten, müssen Sie sie einschließen:

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

Hmm .. Dies ist kein Fehler, sondern eine Funktion... zu verhindern, dass bash versucht, sich zu entwickeln !", du könntest:

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: Konstruiere die Variable mit dem eingebaut Befehl

Das printf  eingebaut Befehl gibt eine leistungsfähige Möglichkeit, Zeichenkettenformat zu zeichnen. Da dies ein Bash ist eingebaut, gibt es eine Option zum Senden formatierter Zeichenfolge an eine Variable statt auf Drucken stdout:

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

Es sind sieben Saiten in diesem Array. Wir könnten also eine formatierte Zeichenfolge mit genau sieben Positionsargumenten erstellen:

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

Oder wir könnten es benutzen ein Argument Format String was wiederholt werden soll, wie viele Argumente eingereicht ...

Beachten Sie, dass unsere a ist immer noch ein Array! Nur das erste Element wurde geändert!

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

Wenn Sie unter bash auf einen Variablennamen zugreifen, ohne den Index anzugeben, adressieren Sie immer nur das erste Element!

Um unser sieben Feldarray zu erhalten, müssen wir nur das erste Element zurücksetzen:

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

Eine Argumentformat-Zeichenfolge mit vielen Argumenten, die an Folgendes übergeben wurden:

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

Verwendung der Stapelüberlauffrage Syntax:

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

Nota: Die Verwendung von Anführungszeichen kann nützlich sein, um Strings zu bearbeiten, die enthalten spaces, tabulations und / oder newlines

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

Shell jetzt

Unter POSIX Shell konnte man nicht benutzen BashismenAlso gibt es kein eingebaut  printf.

Grundsätzlich gilt

Aber du könntest einfach tun:

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

Formatiert mit gegabelt  printf

Wenn Sie anspruchsvollere Konstruktionen verwenden möchten, müssen Sie eine verwenden Gabel (neuer untergeordneter Prozess, der den Job erstellt und das Ergebnis über stdout):

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

Historisch könnten Sie verwenden Backticks zum Abrufen des Ergebnisses von a Gabel:

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

Aber das ist nicht einfach für Verschachtelung:

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

Bei Backticks musst du mit den inneren Gabeln entkommen Backslashes:

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



Sie können dies auch tun:

$ 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"

Wird ausgegeben

helloohaikthxbye

Dies ist nützlich, wenn      $blaohai führt zu einer Variablen nicht gefundenen Fehler. Oder wenn Sie Leerzeichen oder andere Sonderzeichen in Ihren Strings haben. "${foo}" entkommt alles, was du hineingesteckt hast.


103
2017-07-25 15:48



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


35
2017-11-15 05:44



Die Art, wie ich das Problem lösen würde, ist einfach

$a$b

Beispielsweise,

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

was produziert

Hello World

Wenn Sie beispielsweise versuchen, eine Zeichenfolge mit einer anderen Zeichenfolge zu verketten,

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

dann echo "$c" wird herstellen

Hello World

mit einem zusätzlichen Platz.

$aWorld

funktioniert nicht, wie du dir vielleicht vorstellen kannst, aber

${a}World

produziert

HelloWorld

29
2018-03-07 16:43