Pregunta Cómo concatenar variables de cadena en Bash


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

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

Aquí, $foo se convierte en "Hola mundo".

¿Cómo se logra esto en Bash?


2095
2017-11-15 05:38


origen


Respuestas:


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
> helloworld

2842
2017-11-15 05:41



Bash también admite un operador + = como se muestra en la siguiente transcripción:

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

933
2017-11-15 08:33



Bash primero

Como esta pregunta es específica para Intento, 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:

Anexar a la cadena var+=...

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

a=2
a+=4
echo $a
24

Utilizando el Pregunta de desbordamiento de pila sintaxis,

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

¡funciona bien!

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

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+=(...)

Nuestra 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 un espacio separado matriz. Si desea almacenar una cadena que contenga espacios en su matriz, debe adjuntarlos:

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

Hmm ... esto no es un error, sino una característica... Para evitar que bash intente desarrollar !", tú 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 incorporado mando

los printf  incorporado comando proporciona una forma poderosa de dibujar el formato de cadena. Como esto es un Bash incorporado, hay una opción para enviar cadenas formateadas a una variable en lugar de imprimirlas stdout:

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

Hay siete instrumentos de cuerda en este conjunto. 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 presentados ...

Tenga en cuenta que nuestro 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 accede a un nombre de variable sin especificar el índice, ¡siempre se dirige solo al primer elemento!

Entonces, para recuperar nuestra matriz de siete campos, solo tenemos que volver a establecer 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!>

Utilizando el Pregunta de desbordamiento de pila sintaxis:

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

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

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

Shell ahora

Debajo POSIX shell, no podrías usar bashisms, entonces no hay incorporado  printf.

Básicamente

Pero podrías simplemente hacer:

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

Formateado, usando ahorquillado  printf

Si desea utilizar construcciones más sofisticadas, debe usar un tenedor (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, podrías usar retrocesos para recuperar el resultado de un tenedor:

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

Pero esto no es fácil para anidando:

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

con apoyos, tienes que escapar de las horquillas interiores con barras invertidas:

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



Usted puede hacer esto también:

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

Producirá

helloohaikthxbye

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


103
2017-07-25 15:48



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


35
2017-11-15 05:44



La forma en que resolvería el problema es solo

$a$b

Por ejemplo,

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

que produce

Hello World

Si intenta concatenar una cadena con otra cadena, por ejemplo,

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

entonces echo "$c" Producirá

Hello World

con un espacio extra

$aWorld

no funciona, como te puedes imaginar, pero

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