Domanda Come concatenare le variabili stringa in Bash


In PHP, le stringhe sono concatenate insieme come segue:

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

Qui, $foo diventa "Hello World".

Come viene realizzato in Bash?


2093
2017-11-15 05:38


origine


risposte:


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

In generale per concatenare due variabili puoi semplicemente scriverle una dopo l'altra:

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

2841
2017-11-15 05:41



Bash supporta anche un operatore + = come mostrato nella seguente trascrizione:

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

933
2017-11-15 08:33



Bash prima

Come questa domanda sta specificamente per bash, la mia prima parte della risposta presenterebbe diversi modi per farlo correttamente:

+=: Aggiungi alla variabile

La sintassi += può essere utilizzato in diversi modi:

Aggiungi alla stringa var+=...

(Dato che sono parsimonioso, userò solo due variabili foo e a e quindi riutilizzare lo stesso nell'intera risposta. ;-)

a=2
a+=4
echo $a
24

Usando il Stack Overflow question sintassi,

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

funziona bene!

Aggiungi a un numero intero ((var+=...))

variabile a è una stringa, ma anche un intero

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

Aggiungi a un array var+=(...)

Nostro a è anche una matrice di un solo elemento.

echo ${a[@]}
36

a+=(18)

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

Nota che tra parentesi, c'è a array separato dallo spazio. Se si desidera memorizzare una stringa contenente spazi nell'array, è necessario includerli:

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

Hmm .. questo non è un bug, ma una funzionalità... Per evitare che bash cerchi di svilupparsi !", potresti:

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: Ricostruisci la variabile usando il incorporato comando

Il printf  incorporato comando fornisce un modo efficace per disegnare il formato di una stringa. Poiché questo è un Bash incorporato, esiste un'opzione per l'invio di una stringa formattata a una variabile invece di stampare stdout:

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

Ce ne sono sette stringhe in questo array. Quindi potremmo costruire una stringa formattata contenente esattamente sette argomenti posizionali:

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

O potremmo usare una stringa di formato di argomento che sarà ripetuto come molti argomenti sottoposti ...

Nota che il nostro a è ancora un array! Solo il primo elemento è cambiato!

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

Sotto bash, quando si accede a un nome di variabile senza specificare l'indice, si rivolge sempre solo al primo elemento!

Quindi, per recuperare il nostro array di sette campi, dobbiamo solo reimpostare il primo elemento:

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

Una stringa di formato di argomento con molti argomenti passati a:

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

Usando il Stack Overflow question sintassi:

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

Nota: l'uso di virgolette può essere utile per manipolare le stringhe che contengono spaces, tabulations e / o newlines

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

Shell ora

Sotto POSIX shell, non puoi usare bashismi, quindi non c'è incorporato  printf.

Fondamentalmente

Ma potresti semplicemente fare:

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

Formattato, usando biforcuta  printf

Se vuoi usare costruzioni più sofisticate devi usare a forchetta (nuovo processo figlio che fa il lavoro e restituisce il risultato via stdout):

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

Storicamente, puoi usare apici inversi per il recupero del risultato di a forchetta:

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

Ma non è facile annidamento:

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

con i backtick, devi sfuggire alle forcelle interne con backslash:

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



Puoi farlo anche tu:

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

Uscirà

helloohaikthxbye

Questo è utile quando      $blaohai porta a un errore variabile non trovato. O se hai spazi o altri caratteri speciali nelle tue corde. "${foo}" correttamente sfugge a qualsiasi cosa tu ci metta.


103
2017-07-25 15:48



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


35
2017-11-15 05:44



Il modo in cui risolverei il problema è giusto

$a$b

Per esempio,

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

che produce

Hello World

Se si tenta di concatenare una stringa con un'altra stringa, ad esempio,

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

poi echo "$c" produrrà

Hello World

con uno spazio extra.

$aWorld

non funziona, come puoi immaginare, ma

${a}World

produce

HelloWorld

29
2018-03-07 16:43



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

22
2017-11-15 05:42