unir Cómo concatenar variables de cadena en Bash




variables en bash (23)

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?


La forma en que solucionaría el problema es simplemente

$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 puedes imaginar, pero

${a}World

produce

HelloWorld

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

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

Saldrá

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 adecuadamente a todo lo que le pongas.


Sin embargo, otro enfoque ...

> H="Hello "
> U="$H""universe."
> echo $U
Hello universe.

... y aún otro más.

> H="Hello "
> U=$H"universe."
> echo $U
Hello universe.

Si desea agregar algo como un guión bajo, use escape (\)

FILEPATH=/opt/myfile

Esto no funciona:

echo $FILEPATH_$DATEX

Esto funciona bien:

echo $FILEPATH\\_$DATEX

Si es como tu ejemplo de agregar " World" a la cadena original, entonces puede ser:

#!/bin/bash

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

La salida:

Hello World

Lo hago de esta manera cuando sea conveniente: ¡Use un comando en línea!

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

Incluso si ahora se permite el operador + =, se ha introducido en Bash 3.1 en 2004.

Cualquier script que use este operador en versiones anteriores de Bash fallará con un error de "comando no encontrado" si tiene suerte, o un "error de sintaxis cerca del token inesperado".

Para aquellos que se preocupan por la compatibilidad con versiones anteriores, siga los métodos de concatenación Bash estándar más antiguos, como los mencionados en la respuesta elegida:

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

La forma más sencilla con comillas:

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

Puedes concatenar sin las comillas. Aquí hay un ejemplo:

$Variable1 Open
$Variable2 Systems
$Variable3 $Variable1$Variable2
$echo $Variable3

Esta última declaración imprimiría "OpenSystems" (sin comillas).

Este es un ejemplo de un script Bash:

v1=hello
v2=world
v3="$v1       $v2"
echo $v3            # Output: hello world
echo "$v3"          # Output: hello       world

Todavía no sé sobre PHP, pero esto funciona en Linux Bash. Si no quieres afectarlo a una variable, puedes intentar esto:

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

>Hello World!

Podría colocar otra variable en lugar de 'Hola' o '!'. Usted podría concatenar más cadenas también.


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


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

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

Hay un caso particular en el que debes tener cuidado:

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

danielsan "daniel"san , y no danielsan , como podrías haber deseado. En este caso deberías hacer en su lugar:

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

Si lo que intentas hacer es dividir una cadena en varias líneas, puedes usar una barra invertida:

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

Con un espacio en el medio:

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

Este también agrega solo un espacio en medio:

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

Aquí hay un resumen conciso de lo que la mayoría de las respuestas están hablando.

Digamos que tenemos dos variables:

a=hello
b=world

La siguiente tabla explica los diferentes contextos donde podemos combinar los valores de a y b para crear una nueva variable, 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, 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

Algunas notas:

  • En general, encerrar el RHS de una tarea entre comillas dobles es una buena práctica, aunque en muchos casos es bastante opcional
  • += es mejor desde el punto de vista del rendimiento si una cadena grande se está construyendo en pequeños incrementos, especialmente en un bucle
  • use {} alrededor de los nombres de las variables para desambiguar su expansión (como en la fila 2 de la tabla anterior)

Ver también:


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

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

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

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

Puedes probar el siguiente camino. Cuando tiene lugar la sustitución, las comillas dobles mantendrán los espacios.

var1="Ram "    
var2="Lakshmana" 
echo $var1$var2
or 
echo var1+=$var2 "bash support += operation.

bcsmc2rtese001 [/tmp]$ var1="Ram "  
bcsmc2rtese001 [/tmp]$ var2="Lakshmana"  
bcsmc2rtese001 [/tmp]$ echo $var1$var2  
Ram Lakshmana  

bcsmc2rtese001 [/tmp]$ var1+=$var2  
bcsmc2rtese001 [/tmp]$ echo $var1  
Ram Lakshmana

También puedes hacer esto:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

Aquí está el uno a través de AWK :

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

Prefiero usar rizos ${} para expandir la variable en la cadena:

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

Los corchetes se ajustarán al uso continuo de la cadena:

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

De lo contrario, usar foo = "$fooWorld" no funcionará.


Quería construir una cadena de una lista. No pude encontrar una respuesta para eso, así que la publico aquí. Aquí esta lo que hice:

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

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

echo ${string}

y luego me sale el siguiente resultado:

1 2 3 4 5




string-concatenation