Wahrscheinlich gut, um sich daran zu gewöhnen, $foodoppelte Anführungszeichen zu setzen, für die Zeiten, in denen es wirklich wichtig ist.
Cascabel
104
Wir haben gelernt, dies immer zu tun, da Leerzeichen bei der Ersetzung von der Shell ignoriert werden, doppelte Anführungszeichen diese Leerzeichen jedoch immer schützen.
Erdbeere
62
Muss in Ihrem ersten Beispiel ein Leerzeichen sein? Ist es möglich so etwas zu tun foo="$fooworld"? Ich würde nicht annehmen ...
unsinnig
341
@nonsensickle Das würde nach einer Variablen namens suchen fooworld. Disambiguierung, dass mit Klammern gemacht wird, wie in foo="${foo}world"...
Twalberg
4
@ JVE999 Ja, das funktioniert auch, obwohl es meiner Meinung nach nicht ganz so gut für die Klarheit des Codes ist ... Aber das mag nur meine Präferenz sein ... Es gibt noch ein paar andere Möglichkeiten, wie es gemacht werden kann - der Punkt ist Stellen Sie sicher, dass der Variablenname von den Teilen ohne Variablennamen getrennt ist, damit er korrekt analysiert wird.
Twalberg
1127
Bash unterstützt auch einen +=Operator, wie in diesem Code gezeigt:
Kann ich diese Syntax mit dem Schlüsselwort export verwenden? zB export A+="Z"oder muss die AVariable nur einmal exportiert werden?
Levesque
3
@levesque: Beide :-). Variablen müssen nur einmal exportiert werden, export A+=Zfunktionieren aber auch ganz gut.
Thkala
38
Da dies ein Bashismus ist, ist es meiner Meinung nach erwähnenswert, dass Sie ihn niemals #!/bin/shin einem Skript verwenden sollten, das diese Konstruktion verwendet.
Score_Under
2
Es ist spezifisch und nur ein Plus-Gleichheitsoperator. Das heißt, im Gegensatz zu Javascript druckt Echo $ A + $ B in Bash "X Y + Z"
phpguru
6
Ein Bashism ist eine Shell-Funktion, die nur in bashund einigen anderen fortgeschritteneren Shells unterstützt wird. Es funktioniert nicht unter busybox shoder dash(was /bin/shin vielen Distributionen der Fall ist) oder bestimmten anderen Shells wie den /bin/shauf FreeBSD bereitgestellten.
Score_Under
960
Bash zuerst
Da diese Frage speziell für Bash steht , würde mein erster Teil der Antwort verschiedene Möglichkeiten aufzeigen, dies richtig zu machen:
+=: An Variable anhängen
Die Syntax +=kann auf verschiedene Arten verwendet werden:
An String anhängen var+=...
(Weil ich sparsam bin, werde ich nur zwei Variablen verwenden foound adann wieder verwenden das gleiche in der ganzen Antwort. ;-)
a=2
a+=4
echo $a24
Verwenden der Stack Overflow- Fragensyntax:
foo="Hello"
foo+=" World"
echo $fooHelloWorld
funktioniert gut!
An eine Ganzzahl anhängen ((var+=...))
Variable aist eine Zeichenfolge, aber auch eine Ganzzahl
Beachten Sie, dass zwischen Klammern ein durch Leerzeichen getrenntes Array steht . Wenn Sie eine Zeichenfolge mit Leerzeichen in Ihrem Array speichern möchten, müssen Sie diese einschließen:
a+=(one word "hello world!")
bash:!": event not found
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: Variable mit dem eingebauten Befehl neu erstellen
Der printfeingebaute Befehl bietet eine leistungsstarke Möglichkeit zum Zeichnen des Zeichenfolgenformats. Da dies ein eingebauter Bash ist , gibt es eine Option zum Senden einer formatierten Zeichenfolge an eine Variable, anstatt auf Folgendes zu drucken stdout:
echo ${a[@]}3618 one word hello world! hello world! hello world!
Dieses Array enthält sieben Zeichenfolgen . Wir könnten also eine formatierte Zeichenfolge erstellen, die genau sieben Positionsargumente enthält:
Hinweis: Die Verwendung von doppelten Anführungszeichen kann nützlich sein, um Zeichenfolgen zu bearbeiten spaces, die tabulationsund / oder enthaltennewlines
printf -v foo "%s World""$foo"
Shell jetzt
Unter der POSIX- Shell konnten Sie keine Bashismen verwenden , daher ist keine integrierte Funktion vorhandenprintf .
Grundsätzlich
Aber Sie könnten einfach tun:
foo="Hello"
foo="$foo World"
echo $fooHelloWorld
Formatiert mit Gabelprintf
Wenn Sie komplexere Konstruktionen verwenden möchten, müssen Sie einen Fork verwenden (neuer untergeordneter Prozess, der den Job erstellt und das Ergebnis über zurückgibt stdout):
Der +=Bediener ist auch viel schneller als $a="$a$b"in meinen Tests. Was Sinn macht.
Matt
7
Diese Antwort ist fantastisch, aber ich denke, es fehlt das var=${var}.shBeispiel in anderen Antworten, was sehr nützlich ist.
Genorama
1
Ist bashdie einzige Shell mit +=Operator? Ich möchte sehen, ob es tragbar genug ist
schneidiger
1
@dashesy nein. Ich bin sicherlich nicht die einzige Shell mit +=Operator, aber all diese Möglichkeiten sind Bashismen , also nicht tragbar! Sogar Sie könnten im Falle einer falschen Bash-Version auf einen besonderen Fehler stoßen!
Während weder Sonderzeichen noch Leerzeichen verwendet werden, sind doppelte Anführungszeichen, Anführungszeichen und geschweifte Klammern nutzlos: var=myscript;var=$var.sh;echo $varDies hätte die gleichen Auswirkungen (dies funktioniert unter Bash, Dash, Busybox und anderen).
F. Hauri
@ F.Hauri, danke, dass du darauf hingewiesen hast. Aber wenn Sie eine Nummer anhängen würden, würde es nicht funktionieren: zB echo $var2produziert nichtmyscript2
Pynchia
@Pynchia Dies funktioniert, weil der Punkt .im Variablennamen unzulässig ist. Wenn sonst echo ${var}2oder siehe meine Antwort
F. Hauri
119
bla=hello
laber=kthx
echo "${bla}ohai${laber}bye"
Wird ausgegeben
helloohaikthxbye
Dies ist nützlich, wenn
$blaohai
ein Fehler mit einer Variablen nicht gefunden wird. Oder wenn Sie Leerzeichen oder andere Sonderzeichen in Ihren Zeichenfolgen haben. "${foo}"entgeht alles, was Sie hineingesteckt haben.
Dies ist die nützlichste Antwort für Shell-Skripte. Ich habe mich in den letzten 30 Minuten wiedergefunden, weil ich vor und nach dem Gleichheitszeichen ein Leerzeichen hatte !!
Stefan
8
foo = "$ {foo} World"
XXL
@XXL Ich würde sicherlich lieber Klammern verwenden, um den Namen von var zu kapseln. Sehr zu empfehlen
Sergio A.
33
Die Art und Weise, wie ich das Problem lösen würde, ist gerecht
$a$b
Zum Beispiel,
a="Hello"
b=" World"
c=$a$b
echo "$c"
was produziert
HelloWorld
Wenn Sie versuchen, eine Zeichenfolge mit einer anderen Zeichenfolge zu verketten, z.
a="Hello"
c="$a World"
dann echo "$c"wird produzieren
HelloWorld
mit einem zusätzlichen Platz.
$aWorld
funktioniert nicht, wie Sie sich vorstellen können, aber
Das überrascht mich; Ich hätte hier erwartet c=$a$b, dasselbe zu tun wie c=$a World(was versuchen würde, Worldals Befehl ausgeführt zu werden). Ich denke, das bedeutet, dass die Zuweisung analysiert wird, bevor die Variablen erweitert werden.
mwfearnley
30
Hier ist eine kurze Zusammenfassung dessen, worüber die meisten Antworten sprechen.
Nehmen wir an, wir haben zwei Variablen und $ 1 wird auf 'eins' gesetzt:
set one two
a=hello
b=world
In der folgenden Tabelle werden die verschiedenen Kontexte erläutert, in denen wir die Werte von kombinieren aund beine neue Variable erstellen können 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
Ein paar Anmerkungen:
Das Einfügen der rechten Seite einer Aufgabe in doppelte Anführungszeichen ist im Allgemeinen eine gute Praxis, obwohl dies in vielen Fällen recht optional ist
+= ist vom Standpunkt der Leistung aus besser, wenn eine große Zeichenfolge in kleinen Schritten erstellt wird, insbesondere in einer Schleife
Verwenden Sie {}um Variablennamen herum, um deren Erweiterung zu unterscheiden (wie in Zeile 2 in der obigen Tabelle). Wie in den Zeilen 3 und 4 zu sehen ist, ist dies nicht erforderlich, es sei {}denn, eine Variable wird mit einer Zeichenfolge verknüpft, die mit einem Zeichen beginnt, das ein gültiges erstes Zeichen im Namen der Shell-Variablen ist, dh Alphabet oder Unterstrich.
Das habe ich getan und fand es so einfach und unkompliziert als die anderen Antworten. Gibt es einen Grund, warum niemand in den Antworten mit den meisten Stimmen auf diese Option hingewiesen hat?
Quimnuss
1
@quimnuss Die Tatsache, dass die Zeichenfolgen nicht mit den in der OP-Frage verwendeten übereinstimmen, könnte ein guter Grund sein.
Jlliagre
20
Wenn Sie so etwas wie einen Unterstrich anhängen möchten, verwenden Sie Escape (\).
Oder alternativ $ {FILEPATH} _ $ DATEX. Hier werden {} verwendet, um die Grenzen des Variablennamens anzugeben. Dies ist angemessen, da der Unterstrich ein legales Zeichen in Variablennamen ist, sodass in Ihrem Snippet-Bash tatsächlich versucht wird, FILEPATH_ aufzulösen, nicht nur $ FILEPATH
Nik O'Lai
1
Für mich hatte ich eine Variable, dh $ var1 und eine Konstante daneben, also funktioniert echo $ var1_costant_traling_part für mich
YouAreAwesome
2
Ich denke, man braucht nur ein Spiel, um zu entkommen: echo $a\_$bwürde tun. Wie im Kommentar von Nik O'Lai angedeutet, ist der Unterstrich ein regulärer Charakter. Der Umgang mit Leerzeichen ist viel empfindlicher für Zeichenfolgen, Echo und Verkettung - man kann \ diesen Thread gründlich verwenden und lesen, da dieses Problem hin und wieder auftritt.
Zu viele Anführungszeichen, IMHO. var=$B$b"a"; echo Hello\ $varwürde tun, ich glaube
XavierStuvw
Ich schlage vor, alle Anführungszeichen zu verwenden, denn wenn Sie es überall platzieren, was Sie nicht verpassen dürfen, müssen Sie nicht nachdenken.
Feindalpfa
15
Sie können ohne Anführungszeichen verketten. Hier ist ein Beispiel:
$Variable1 Open
$Variable2 Systems
$Variable3 $Variable1$Variable2
$echo $Variable3
Diese letzte Anweisung würde "OpenSystems" (ohne Anführungszeichen) drucken.
Dies ist ein Beispiel für ein Bash-Skript:
v1=hello
v2=world
v3="$v1 $v2"
echo $v3 # Output: hello world
echo "$v3"# Output: hello world
Die Syntax des ersten Blocks ist verwirrend. Was bedeuten diese $ -Zeichen?
XavierStuvw
15
Auch wenn der Operator + = jetzt zulässig ist, wurde er 2004 in Bash 3.1 eingeführt .
Jedes Skript, das diesen Operator in älteren Bash-Versionen verwendet, schlägt mit dem Fehler "Befehl nicht gefunden" fehl, wenn Sie Glück haben, oder mit einem "Syntaxfehler in der Nähe eines unerwarteten Tokens".
Wenn Sie sich für die Abwärtskompatibilität interessieren, sollten Sie sich an die älteren Standard-Bash-Verkettungsmethoden halten, wie sie in der ausgewählten Antwort erwähnt werden:
Der Punkt der Zeichenfolgen mit einem Leerzeichen, das als Befehl gelesen wird, wird am Definitionspunkt angezeigt. Also d=DD DDwürde geben DD: command not found--- beachten Sie, dass dies die letzte DD ist, eher d, die nicht gefunden wird. Wenn alle Operanden richtig formatiert sind und bereits die erforderlichen Leerzeichen enthalten, können Sie einfach s=${a}${b}${c}${d}; echo $smit weniger Anführungszeichen verketten . Sie können auch \ (maskiertes Leerzeichen) verwenden, um diese Probleme zu vermeiden. d=echo\ echoWird keinen Echoaufruf starten, wohingegen dies der d=echo echoFall ist.
XavierStuvw
7
Es gibt einen besonderen Fall, in dem Sie aufpassen sollten:
Dies funktioniert, führt jedoch manchmal zu unvorhersehbaren Ergebnissen, da die Variableninterpolation nicht geschützt ist. Daher können Sie sich nicht für alle Anwendungsfälle auf dieses Formular verlassen.
Anthony Rutledge
5
Wenn dies Ihr Beispiel für das Hinzufügen " World"zur ursprünglichen Zeichenfolge ist, kann es sein:
Die Fehler zeigen an, dass mein Bash bis zu 335.54432 MB groß war, bevor er abstürzte. Sie können den Code von der Verdoppelung der Daten zum Anhängen einer Konstante ändern , um ein detaillierteres Diagramm und einen Fehlerpunkt zu erhalten. Aber ich denke, dies sollte Ihnen genügend Informationen geben, um zu entscheiden, ob Sie sich interessieren. Persönlich unter 100 MB tue ich das nicht. Ihr Kilometerstand kann variieren.
Trotz des speziellen Operators gibt es +=für die Verkettung einen einfacheren Weg:
foo='Hello'
foo=$foo' World'
echo $foo
Doppelte Anführungszeichen benötigen eine zusätzliche Berechnungszeit für die Interpretation der darin enthaltenen Variablen. Vermeiden Sie es wenn möglich.
Dies geschieht, weil der Unterstrich das gültige Zeichen in Variablennamen ist, sodass bash foo_ als Variable sieht. Wenn es notwendig ist, bash die genauen Grenzen des Variablennamens mitzuteilen, können die geschweiften Klammern verwendet werden: PREFIX _ $ {foo} _ $ bar
In der ersten Zeile können Sie eine Gabel fallen lassen, indem Sie: date "+The current time is %a %b %d %Y +%T"anstelle von verwenden echo ...$(date). Unter der letzten Bash könnten Sie schreiben : printf "The current time is %(%a %b %d %Y +%T)T\n" -1.
F. Hauri
1
Meiner Meinung nach besteht der einfachste Weg, zwei Zeichenfolgen zu verketten, darin, eine Funktion zu schreiben, die dies für Sie erledigt, und diese Funktion dann zu verwenden.
Das Aufrufen einer Funktion, auch in einer Subshell, ist für einen einfachen Concat zu viel Overkill.
Codeforester
-1
Ich weiß noch nichts über PHP, aber das funktioniert unter Linux Bash. Wenn Sie die Variable nicht beeinflussen möchten, können Sie Folgendes versuchen:
read pp;*#Assumes I will affect Hello to pp*
pp=$( printf $pp ;printf ' World'; printf '!');
echo $pp;>HelloWorld!
Sie können anstelle von "Hallo" oder "!" Eine andere Variable einfügen. Sie können auch mehr Zeichenfolgen verketten.
foo="Hello"
foo=$foo" World"
echo $foo
Dies funktionierte eher für "#! / bin / sh"foo1="World" foo2="Hello" foo3="$foo1$foo2"
Antworten:
Um zwei Variablen zu verketten, können Sie sie im Allgemeinen einfach nacheinander schreiben:
quelle
$foo
doppelte Anführungszeichen zu setzen, für die Zeiten, in denen es wirklich wichtig ist.foo="$fooworld"
? Ich würde nicht annehmen ...fooworld
. Disambiguierung, dass mit Klammern gemacht wird, wie infoo="${foo}world"
...Bash unterstützt auch einen
+=
Operator, wie in diesem Code gezeigt:quelle
export A+="Z"
oder muss dieA
Variable nur einmal exportiert werden?export A+=Z
funktionieren aber auch ganz gut.#!/bin/sh
in einem Skript verwenden sollten, das diese Konstruktion verwendet.bash
und einigen anderen fortgeschritteneren Shells unterstützt wird. Es funktioniert nicht unterbusybox sh
oderdash
(was/bin/sh
in vielen Distributionen der Fall ist) oder bestimmten anderen Shells wie den/bin/sh
auf FreeBSD bereitgestellten.Bash zuerst
Da diese Frage speziell für Bash steht , würde mein erster Teil der Antwort verschiedene Möglichkeiten aufzeigen, dies richtig zu machen:
+=
: An Variable anhängenDie Syntax
+=
kann auf verschiedene Arten verwendet werden:An String anhängen
var+=...
(Weil ich sparsam bin, werde ich nur zwei Variablen verwenden
foo
unda
dann wieder verwenden das gleiche in der ganzen Antwort. ;-)Verwenden der Stack Overflow- Fragensyntax:
funktioniert gut!
An eine Ganzzahl anhängen
((var+=...))
Variable
a
ist eine Zeichenfolge, aber auch eine GanzzahlAn ein Array anhängen
var+=(...)
Unser
a
ist auch eine Reihe von nur einem Element.Beachten Sie, dass zwischen Klammern ein durch Leerzeichen getrenntes Array steht . Wenn Sie eine Zeichenfolge mit Leerzeichen in Ihrem Array speichern möchten, müssen Sie diese einschließen:
Hmm .. das ist kein Fehler, sondern eine Funktion ... Um zu verhindern, dass Bash versucht, sich zu entwickeln
!"
, könnten Sie:printf
: Variable mit dem eingebauten Befehl neu erstellenDer
printf
eingebaute Befehl bietet eine leistungsstarke Möglichkeit zum Zeichnen des Zeichenfolgenformats. Da dies ein eingebauter Bash ist , gibt es eine Option zum Senden einer formatierten Zeichenfolge an eine Variable, anstatt auf Folgendes zu druckenstdout
:Dieses Array enthält sieben Zeichenfolgen . Wir könnten also eine formatierte Zeichenfolge erstellen, die genau sieben Positionsargumente enthält:
Oder wir könnten eine Zeichenfolge im Argumentformat verwenden, die wiederholt wird, sobald viele Argumente eingereicht wurden ...
Beachten Sie, dass unser
a
Array immer noch ist! Nur das erste Element wird geändert!Wenn Sie unter bash auf einen Variablennamen zugreifen, ohne einen Index anzugeben, adressieren Sie immer nur das erste Element!
Um unser Array mit sieben Feldern abzurufen, müssen wir nur das erste Element zurücksetzen:
Eine Zeichenfolge im Argumentformat mit vielen Argumenten, die übergeben werden an:
Verwenden der Stack Overflow- Fragensyntax:
Hinweis: Die Verwendung von doppelten Anführungszeichen kann nützlich sein, um Zeichenfolgen zu bearbeiten
spaces
, dietabulations
und / oder enthaltennewlines
Shell jetzt
Unter der POSIX- Shell konnten Sie keine Bashismen verwenden , daher ist keine integrierte Funktion vorhanden
printf
.Grundsätzlich
Aber Sie könnten einfach tun:
Formatiert mit Gabel
printf
Wenn Sie komplexere Konstruktionen verwenden möchten, müssen Sie einen Fork verwenden (neuer untergeordneter Prozess, der den Job erstellt und das Ergebnis über zurückgibt
stdout
):In der Vergangenheit konnten Sie Backticks zum Abrufen des Ergebnisses einer Gabelung verwenden :
Dies ist jedoch nicht einfach zum Verschachteln :
Mit Backticks müssen Sie den inneren Gabeln mit Backslashes entkommen :
quelle
+=
Bediener ist auch viel schneller als$a="$a$b"
in meinen Tests. Was Sinn macht.var=${var}.sh
Beispiel in anderen Antworten, was sehr nützlich ist.bash
die einzige Shell mit+=
Operator? Ich möchte sehen, ob es tragbar genug ist+=
Operator, aber all diese Möglichkeiten sind Bashismen , also nicht tragbar! Sogar Sie könnten im Falle einer falschen Bash-Version auf einen besonderen Fehler stoßen!Sie können dies auch tun:
quelle
var=myscript;var=$var.sh;echo $var
Dies hätte die gleichen Auswirkungen (dies funktioniert unter Bash, Dash, Busybox und anderen).echo $var2
produziert nichtmyscript2
.
im Variablennamen unzulässig ist. Wenn sonstecho ${var}2
oder siehe meine AntwortWird ausgegeben
Dies ist nützlich, wenn
$blaohai
ein Fehler mit einer Variablen nicht gefunden wird. Oder wenn Sie Leerzeichen oder andere Sonderzeichen in Ihren Zeichenfolgen haben."${foo}"
entgeht alles, was Sie hineingesteckt haben.quelle
quelle
Die Art und Weise, wie ich das Problem lösen würde, ist gerecht
Zum Beispiel,
was produziert
Wenn Sie versuchen, eine Zeichenfolge mit einer anderen Zeichenfolge zu verketten, z.
dann
echo "$c"
wird produzierenmit einem zusätzlichen Platz.
funktioniert nicht, wie Sie sich vorstellen können, aber
produziert
quelle
${a}\ World
produziertHello World
c=$a$b
, dasselbe zu tun wiec=$a World
(was versuchen würde,World
als Befehl ausgeführt zu werden). Ich denke, das bedeutet, dass die Zuweisung analysiert wird, bevor die Variablen erweitert werden.Hier ist eine kurze Zusammenfassung dessen, worüber die meisten Antworten sprechen.
Nehmen wir an, wir haben zwei Variablen und $ 1 wird auf 'eins' gesetzt:
In der folgenden Tabelle werden die verschiedenen Kontexte erläutert, in denen wir die Werte von kombinieren
a
undb
eine neue Variable erstellen könnenc
.Ein paar Anmerkungen:
+=
ist vom Standpunkt der Leistung aus besser, wenn eine große Zeichenfolge in kleinen Schritten erstellt wird, insbesondere in einer Schleife{}
um Variablennamen herum, um deren Erweiterung zu unterscheiden (wie in Zeile 2 in der obigen Tabelle). Wie in den Zeilen 3 und 4 zu sehen ist, ist dies nicht erforderlich, es sei{}
denn, eine Variable wird mit einer Zeichenfolge verknüpft, die mit einem Zeichen beginnt, das ein gültiges erstes Zeichen im Namen der Shell-Variablen ist, dh Alphabet oder Unterstrich.Siehe auch:
quelle
quelle
Noch ein Ansatz ...
... und noch eine.
quelle
Wenn Sie so etwas wie einen Unterstrich anhängen möchten, verwenden Sie Escape (\).
Das funktioniert nicht :
Das funktioniert gut:
quelle
echo $a\_$b
würde tun. Wie im Kommentar von Nik O'Lai angedeutet, ist der Unterstrich ein regulärer Charakter. Der Umgang mit Leerzeichen ist viel empfindlicher für Zeichenfolgen, Echo und Verkettung - man kann\
diesen Thread gründlich verwenden und lesen, da dieses Problem hin und wieder auftritt.Der einfachste Weg mit Anführungszeichen:
quelle
var=$B$b"a"; echo Hello\ $var
würde tun, ich glaubeSie können ohne Anführungszeichen verketten. Hier ist ein Beispiel:
Diese letzte Anweisung würde "OpenSystems" (ohne Anführungszeichen) drucken.
Dies ist ein Beispiel für ein Bash-Skript:
quelle
Auch wenn der Operator + = jetzt zulässig ist, wurde er 2004 in Bash 3.1 eingeführt .
Jedes Skript, das diesen Operator in älteren Bash-Versionen verwendet, schlägt mit dem Fehler "Befehl nicht gefunden" fehl, wenn Sie Glück haben, oder mit einem "Syntaxfehler in der Nähe eines unerwarteten Tokens".
Wenn Sie sich für die Abwärtskompatibilität interessieren, sollten Sie sich an die älteren Standard-Bash-Verkettungsmethoden halten, wie sie in der ausgewählten Antwort erwähnt werden:
quelle
Ich bevorzuge geschweifte Klammern
${}
zum Erweitern der Variablen in der Zeichenfolge:Geschweifte Klammern passen zur kontinuierlichen Verwendung von Zeichenfolgen:
Andernfalls
foo = "$fooWorld"
funktioniert die Verwendung nicht.quelle
Wenn Sie versuchen, eine Zeichenfolge in mehrere Zeilen aufzuteilen , können Sie einen Backslash verwenden:
Mit einem Leerzeichen dazwischen:
Dieser fügt auch nur ein Leerzeichen dazwischen hinzu:
quelle
Sicherer Weg:
Zeichenfolgen, die Leerzeichen enthalten, können Teil des Befehls werden. Verwenden Sie "$ XXX" und "$ {XXX}", um diese Fehler zu vermeiden.
Schauen Sie sich auch eine andere Antwort zu + = an
quelle
d=DD DD
würde gebenDD: command not found
--- beachten Sie, dass dies die letzte DD ist, eher d, die nicht gefunden wird. Wenn alle Operanden richtig formatiert sind und bereits die erforderlichen Leerzeichen enthalten, können Sie einfachs=${a}${b}${c}${d}; echo $s
mit weniger Anführungszeichen verketten . Sie können auch\
(maskiertes Leerzeichen) verwenden, um diese Probleme zu vermeiden.d=echo\ echo
Wird keinen Echoaufruf starten, wohingegen dies derd=echo echo
Fall ist.Es gibt einen besonderen Fall, in dem Sie aufpassen sollten:
Wird ausgegeben
"daniel"san
und nichtdanielsan
, wie Sie vielleicht wollten. In diesem Fall sollten Sie stattdessen Folgendes tun:quelle
So verketten Sie zwei Zeichenfolgen.
quelle
Wenn dies Ihr Beispiel für das Hinzufügen
" World"
zur ursprünglichen Zeichenfolge ist, kann es sein:Die Ausgabe:
quelle
quelle
var3=$var1\ $var2
Es gibt Bedenken hinsichtlich der Leistung, es werden jedoch keine Daten angeboten. Lassen Sie mich einen einfachen Test vorschlagen.
(HINWEIS: Unter
date
macOS werden keine Nanosekunden angeboten, daher muss dies unter Linux erfolgen.)Ich habe append_test.sh auf GitHub mit dem Inhalt erstellt:
Test 1:
Test 2:
Die Fehler zeigen an, dass mein Bash bis zu 335.54432 MB groß war, bevor er abstürzte. Sie können den Code von der Verdoppelung der Daten zum Anhängen einer Konstante ändern , um ein detaillierteres Diagramm und einen Fehlerpunkt zu erhalten. Aber ich denke, dies sollte Ihnen genügend Informationen geben, um zu entscheiden, ob Sie sich interessieren. Persönlich unter 100 MB tue ich das nicht. Ihr Kilometerstand kann variieren.
quelle
join <(LANG=C bash -c 'a="a" c=1 last=${EPOCHREALTIME//.};while :;do a+=$a;now=${EPOCHREALTIME//.};echo $((c++)) ${#a} $((now-last));last=$now;done') <(LANG=C bash -c 'a="a" c=1 last=${EPOCHREALTIME//.};while :;do a=$a$a;now=${EPOCHREALTIME//.};echo $((c++)) ${#a} $((now-last));last=$now;done')|sed -ue '1icnt strlen a+=$a a=$a$a' -e 's/^\([0-9]\+\) \([0-9]\+\) \([0-9]\+\) \2/\1 \2 \3/' | xargs printf "%4s %11s %9s %9s\n"
(Versuchen Sie dies auf einem nicht produktiven Host !!;)Ich wollte einen String aus einer Liste erstellen. Konnte keine Antwort darauf finden, also poste ich sie hier. Folgendes habe ich getan:
und dann bekomme ich folgende ausgabe:
quelle
Trotz des speziellen Operators gibt es
+=
für die Verkettung einen einfacheren Weg:Doppelte Anführungszeichen benötigen eine zusätzliche Berechnungszeit für die Interpretation der darin enthaltenen Variablen. Vermeiden Sie es wenn möglich.
quelle
Beachten Sie, dass dies nicht funktioniert
wie es scheint, $ foo fallen zu lassen und lässt Sie mit:
aber das wird funktionieren:
und lassen Sie mit der richtigen Ausgabe:
quelle
Hier ist der durch AWK :
quelle
Ich mache es so, wenn es Ihnen passt: Verwenden Sie einen Inline-Befehl!
quelle
date "+The current time is %a %b %d %Y +%T"
anstelle von verwendenecho ...$(date)
. Unter der letzten Bash könnten Sie schreiben :printf "The current time is %(%a %b %d %Y +%T)T\n" -1
.Meiner Meinung nach besteht der einfachste Weg, zwei Zeichenfolgen zu verketten, darin, eine Funktion zu schreiben, die dies für Sie erledigt, und diese Funktion dann zu verwenden.
quelle
Ich mache gerne eine schnelle Funktion.
Noch eine andere Art, eine Katze zu häuten. Diesmal mit Funktionen: D.
quelle
Ich weiß noch nichts über PHP, aber das funktioniert unter Linux Bash. Wenn Sie die Variable nicht beeinflussen möchten, können Sie Folgendes versuchen:
Sie können anstelle von "Hallo" oder "!" Eine andere Variable einfügen. Sie können auch mehr Zeichenfolgen verketten.
quelle