¿Cómo puedo concatenar una variable de shell a otros parámetros en mis líneas de comando?

16

¿Cómo puedo concatenar una variable de shell a otros parámetros en mis líneas de comando?

Por ejemplo,

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > $WEBSITE.sql

Necesito concatenar .sql a$WEBSITE

aneuryzm
fuente

Respuestas:

26

Utilizar ${ } para encerrar una variable.

Sin llaves:

VAR="foo"
echo $VAR
echo $VARbar

daría

foo

y nada, porque la variable $VARbarno existe.

Con llaves:

VAR="foo"
echo ${VAR}
echo ${VAR}bar

daría

foo
foobar

Adjuntar el primero $VARno es necesario, pero es una buena práctica.

Por su ejemplo:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword ${WEBSITE} > ${WEBSITE}.sql

Esto funciona para bash, zsh, ksh, tal vez otros también.

meneo
fuente
3
Esto funciona para todas las conchas de estilo Bourne (Bourne, POSIX, bash, ksh, zsh), conchas de estilo C (csh, tcsh) e incluso en peces sin llaves. Por lo tanto, es realmente universal entre los shells de Unix. No llamaría a los aparatos ortopédicos una buena práctica. Pero sí llamo sistemáticamente usando comillas dobles alrededor de sustituciones variables como buena práctica.
Gilles 'SO- deja de ser malvado'
1
@Gilles, iría más lejos y diría que no usar comillas dobles alrededor de sustituciones variables es una muy mala práctica.
Stéphane Chazelas
Además, tenga cuidado de que ${ }no sea concatenación en ningún sentido. Por ejemplo, ELP=elp && echo $ELP && man --h${EPL}no funciona.
foki
4

Simplemente concatene los contenidos variables a cualquier otra cosa que desee concatenar, por ejemplo

/usr/bin/mysqldump --opt -u root --ppassword "$WEBSITE" > "$WEBSITE.sql"

Las comillas dobles no están relacionadas con la concatenación: aquí >$WEBSITE.sqltambién habría funcionado. Se necesitan alrededor de expansiones de variables cuando el valor de la variable puede contener algunos caracteres especiales de shell (espacios en blanco y \[?*). Recomiendo poner comillas dobles alrededor de todas las expansiones de variables y sustituciones de comandos, es decir, siempre escribir "$WEBSITE"y "$(mycommand)".

Para más detalles, vea $ VAR vs $ {VAR} y para cotizar o no cotizar .

Gilles 'SO- deja de ser malvado'
fuente
2

Usualmente uso comillas, por ejemplo echo "$WEBSITE.sql".

Entonces podrías escribirlo así:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > "$WEBSITE.sql"
Gert
fuente
3
Esto funciona ya .que no es un carácter válido en un nombre de variable; vea la respuesta de wag si desea concatenar una cadena que comienza con caracteres válidos (por ejemplo, "$ WEBSITEsql" no funcionaría)
Michael Mrozek