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?
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?
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
Bash también admite un operador + = como se muestra en la siguiente transcripción:
$ A="X Y"
$ A+="Z"
$ echo "$A"
X YZ
Como esta pregunta es específica para Intento, mi primera parte de la respuesta presentaría diferentes formas de hacerlo correctamente:
+=
: Agregar a la variableLa sintaxis +=
se puede usar de diferentes maneras:
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!
((var+=...))
variable a
es una cadena, pero también un número entero
echo $a
24
((a+=12))
echo $a
36
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 mandolos 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!>
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"
Debajo POSIX shell, no podrías usar bashisms, entonces no hay incorporado printf
.
Pero podrías simplemente hacer:
foo="Hello"
foo="$foo World"
echo $foo
Hello World
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
Usted puede hacer esto también:
$ var="myscript"
$ echo $var
myscript
$ var=${var}.sh
$ echo $var
myscript.sh
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.
foo="Hello "
foo="$foo World"
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
$ a=hip
$ b=hop
$ ab=$a$b
$ echo $ab
hiphop
$ echo $a$b
hiphop