Cómo concatenar variables de cadena en Bash

bash shell syntax concat string-concatenation


En PHP,las cadenas se concatenan de la siguiente manera:

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

Aquí, $foo convierte en "Hello World".

¿Cómo se logra esto en Bash?




Answer 1 codaddict


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

En general,para concatenar dos variables puedes escribirlas una tras otra:

a='Hello'
b='World'
c="${a} ${b}"
echo "${c}"
> Hello World



Answer 2 thkala


Bash también admite un operador += como se muestra en este código:

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



Answer 3 F. Hauri


Primero Bash

Como esta pregunta se refiere específicamente a Bash , mi primera parte de la respuesta presentaría diferentes formas de hacerlo correctamente:

+= : Agregar a la variable

La sintaxis += se puede usar de diferentes maneras:

Añadir a la cadena var+=...

(Debido a que soy frugal, solo usaré dos variables foo y a y luego reutilizaré lo mismo en toda la respuesta. ;-)

a=2
a+=4
echo $a
24

Usando la sintaxis de preguntas de desbordamiento de pila ,

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

funciona bien!

Agregar a un entero ((var+=...))

la variable a es una cadena, pero también un número entero

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

Agregar a una matriz var+=(...)

Nuestro a también es una matriz de un solo elemento.

echo ${a[@]}
36

a+=(18)

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

Tenga en cuenta que entre paréntesis, hay una matriz separada por espacios . Si desea almacenar una cadena que contiene espacios en su matriz, debe encerrarlos:

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

Hmm ... esto no es un error, sino una característica ... ¡Para evitar que bash intente desarrollarse !" , Podrías:

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 : Reconstruir variable usando el comando incorporado

El comando incorporado printf ofrece una forma poderosa de dibujar el formato de cadena. Como se trata de un Bash incorporado , hay una opción para enviar cadenas formateadas a una variable en lugar de imprimir en stdout :

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

Hay siete cadenas en esta matriz. Entonces podríamos construir una cadena formateada que contenga exactamente siete argumentos posicionales:

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

O podríamos usar una cadena de formato de argumento que se repetirá como muchos argumentos enviados ...

Tenga en cuenta que nuestra a sigue siendo una matriz! ¡Solo se cambia el primer elemento!

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

Bajo bash,cuando se accede a un nombre de variable sin especificar el índice,¡siempre se dirige al primer elemento solamente!

Así que para recuperar nuestra matriz de siete campos,sólo tenemos que reajustar el primer 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 cadena de formato de argumento con muchos argumentos pasados a:

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

Usando la sintaxis de preguntas de desbordamiento de pila :

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

Nota: El uso de comillas dobles puede ser útil para manipular cadenas que contienen spaces , tabulations y / o newlines

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

Ahora,la cáscara...

En el shell POSIX , no puede usar bashisms , por lo que no hay printf incorporado .

Basically

Pero podrías simplemente hacerlo:

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

Formateado, utilizando printf bifurcada

Si desea usar construcciones más sofisticadas, debe usar una bifurcación (nuevo proceso secundario que hace el trabajo y devuelve el resultado a través de stdout ):

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

Históricamente, puede usar los backticks para recuperar el resultado de una bifurcación :

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

Pero esto no es fácil para anidar :

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

con backticks, debes escapar de las horquillas internas con barras invertidas :

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



Answer 4 userend


Tú también puedes hacer esto:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh



Answer 5 orkoden


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

La salida de la voluntad

helloohaikthxbye

Esto es útil cuando $blaohai conduce a un error de variable no encontrada. O si tiene espacios u otros caracteres especiales en sus cadenas. "${foo}" escapa correctamente de todo lo que pones en él.