bash - verketten - shell variable in string




Wie verketten Sie String-Variablen in Bash? (19)

Bash zuerst

Da diese Frage speziell für Bash , würde mein erster Teil der Antwort verschiedene Wege aufzeigen, um dies richtig zu machen:

+= : An Variable anhängen

Die Syntax += kann auf verschiedene Arten verwendet werden:

An den String var+=... anhängen

(Da ich sparsam bin, verwende ich nur zwei Variablen foo und a und verwende dann dieselbe wieder in der gesamten Antwort. ;-)

a=2
a+=4
echo $a
24

Die Fragensyntax Stack Overflow verwenden ,

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

funktioniert gut!

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

Variable a ist eine Zeichenfolge, aber auch eine ganze Zahl

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

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

Unser a ist auch ein Array von nur einem Element.

echo ${a[@]}
36

a+=(18)

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

Beachten Sie, dass sich zwischen den Klammern ein durch Leerzeichen getrenntes Array befindet . 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

Hmm .. das ist kein Fehler, sondern eine Funktion ... Um zu verhindern, dass sich Bash entwickelt, !" könnten Sie:

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 : Erstellen Sie die Variable mit dem integrierten Befehl neu

Der eingebaute Befehl printf bietet eine leistungsfähige Möglichkeit zum Zeichnen von Zeichenfolgen. Da dies ein Bash- Builtin ist , gibt es eine Option zum Senden einer formatierten Zeichenfolge an eine Variable, anstatt auf stdout drucken:

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

Es gibt sieben Strings in diesem Array. Wir könnten also eine formatierte Zeichenfolge erstellen, die genau sieben Positionsargumente enthält:

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 einen Argumentformatstring verwenden, der wiederholt wird, wenn viele Argumente übergeben werden ...

Beachten Sie, dass unser a immer noch ein Array ist! Nur das erste Element wird 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 einen Index anzugeben, adressieren Sie immer nur das erste Element!

Um unser Feld mit sieben Feldern abzurufen, 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 Argumentformatzeichenfolge mit vielen Argumenten, die übergeben werden:

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

Verwenden der Fragensyntax Stack Overflow :

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

Hinweis: Die Verwendung von Anführungszeichen kann hilfreich sein, um Zeichenfolgen zu newlines , die spaces , newlines und / oder newlines

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

Shell jetzt

Unter der POSIX- Shell konnten Sie keine Bashisms verwenden , so dass kein printf .

Grundsätzlich gilt

Sie könnten aber einfach folgendes tun:

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

Formatiert, mit gabelförmigem printf

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

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

In der Vergangenheit könnten Sie Backticks verwenden, um das Ergebnis einer Verzweigung abzurufen:

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

Dies ist jedoch nicht einfach zum Schachteln :

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

mit Backticks müssen Sie inneren Gabeln mit Backslashes entkommen:

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

In PHP werden Zeichenfolgen wie folgt miteinander verkettet:

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

Hier wird $foo "Hello World".

Wie wird das in Bash erreicht?


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 einem Fehler "Befehl nicht gefunden" fehl, wenn Sie Glück haben, oder mit einem "Syntaxfehler in der Nähe eines unerwarteten Token".

Für diejenigen, die sich für die Rückwärtskompatibilität interessieren, halten Sie sich an die älteren Standard-Bash-Verkettungsmethoden, wie sie in der ausgewählten Antwort erwähnt werden:

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

Beachten Sie, dass dies nicht funktioniert

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

wie es scheint, $ foo fallen zu lassen und lässt Sie mit:

PREFIX_WORLD

aber das wird funktionieren:

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

und lass dich mit der korrekten Ausgabe:

PREFIX_HELLO_WORLD


Der einfachste Weg mit Anführungszeichen:

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

Es gibt einen bestimmten Fall, in dem Sie aufpassen sollten:

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

Wird "daniel"san ausgeben und nicht danielsan , wie Sie es sich gewünscht haben. In diesem Fall sollten Sie stattdessen Folgendes tun:

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

Hier ist der durch AWK :

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

Ich kenne PHP noch nicht, aber das funktioniert in Linux Bash. Wenn Sie es nicht auf eine Variable anwenden möchten, können Sie Folgendes versuchen:

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

>Hello World!

Sie können anstelle von "Hallo" oder "!" Eine andere Variable platzieren. Sie könnten auch mehr Strings verketten.


Ich mache es so, wenn es bequem ist: Verwenden Sie einen Inline-Befehl!

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

Ich wollte eine Zeichenfolge aus einer Liste erstellen. Konnte keine Antwort finden, deshalb poste ich sie hier. Folgendes habe ich getan:

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

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

echo ${string}

und dann bekomme ich folgende Ausgabe:

1 2 3 4 5

Ich ziehe es vor, geschweifte Klammern ${} zu verwenden, um eine Variable in einem String zu erweitern:

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

Geschweifte Klammern passen zur fortlaufenden Saitenanwendung:

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

Ansonsten foo = "$fooWorld" nicht.


Sicherer Weg:

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

Zeichenfolgen, die Leerzeichen enthalten, können Bestandteil des Befehls werden. Verwenden Sie "$ XXX" und "$ {XXX}", um diese Fehler zu vermeiden.

Schauen Sie sich auch andere Antworten zu + = an


Sie können das auch tun:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

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

So würde ich das Problem lösen

$a$b

Zum Beispiel,

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

was produziert

Hello World

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

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

dann wird echo "$c" erzeugt

Hello World

mit zusätzlichem Platz.

$aWorld

funktioniert nicht, wie Sie sich vielleicht vorstellen, aber

${a}World

produziert

HelloWorld

Wenn Sie versuchen, eine Zeichenfolge in mehrere Zeilen aufzuteilen , können Sie einen umgekehrten Schrägstrich verwenden:

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

Mit einem Leerzeichen dazwischen:

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

Dieses fügt auch nur ein Leerzeichen dazwischen hinzu:

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

Wenn es sich bei Ihrem Beispiel um das Hinzufügen von " World" zur Originalzeichenfolge handelt, kann es sich um Folgendes handeln:

#!/bin/bash

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

Die Ausgabe:

Hello World

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

Wird ausgegeben

helloohaikthxbye

Dies ist nützlich, wenn $blaohai zu einer nicht gefundenen Variablen führt. Oder wenn Sie Leerzeichen oder andere Sonderzeichen in Ihren Zeichenfolgen haben. "${foo}" entgeht richtig dem, was Sie hineinlegen.


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


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




string-concatenation