Como concatenar uma variável de shell para outros outros parâmetros nas minhas linhas de comando?

16

Como concatenar uma variável de shell para outros outros parâmetros nas minhas linhas de comando?

Por exemplo,

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

Eu preciso concatenar .sqlpara$WEBSITE

aneuryzm
fonte

Respostas:

26

Use ${ }para incluir uma variável.

Sem colchetes:

VAR="foo"
echo $VAR
echo $VARbar

daria

foo

e nada, porque a variável $VARbarnão existe.

Com colchetes:

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

daria

foo
foobar

Não $VARé necessário incluir o primeiro , mas uma boa prática.

Para o seu exemplo:

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

Isso funciona para bash, zsh, ksh, talvez outros também.

abanar
fonte
3
Isso funciona para todas as conchas no estilo Bourne (Bourne, POSIX, bash, ksh, zsh), conchas no estilo C (csh, tcsh) e até mesmo em peixes sem chaves. Portanto, é realmente universal entre os shells unix. Eu não chamaria o aparelho de boa prática. Mas eu chamo sistematicamente usando aspas duplas em torno das boas práticas de substituição de variáveis.
Gilles 'SO- stop be evil'
11
@ Gilles, eu iria além e diria que não usar aspas duplas em substituição de variáveis ​​é uma prática muito ruim .
Stéphane Chazelas
Além disso, tome cuidado para que ${ }não seja concatenação em nenhum sentido. Por exemplo, ELP=elp && echo $ELP && man --h${EPL}não funciona.
foki 17/06/19
4

Apenas concatene o conteúdo da variável para o que mais você deseja concatenar, por exemplo

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

As aspas duplas não estão relacionadas à concatenação: aqui >$WEBSITE.sqltambém teria funcionado. Eles são necessários para expansões de variáveis ​​quando o valor da variável pode conter alguns caracteres especiais do shell (espaços em branco e \[?*). Eu recomendo colocar aspas duplas em todas as expansões variáveis ​​e substituições de comandos, ou seja, sempre escreva "$WEBSITE"e "$(mycommand)".

Para mais detalhes, consulte $ VAR vs $ {VAR} e para citar ou não .

Gilles 'SO- parar de ser mau'
fonte
2

Eu costumo usar aspas, por exemplo echo "$WEBSITE.sql".

Então você pode escrever como:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > "$WEBSITE.sql"
Gert
fonte
3
Isso funciona, pois .não é um caractere válido em um nome de variável; ver a resposta de wag se você quiser concatenar uma cadeia que se inicia com caracteres válidos (por exemplo, "$ WEBSITEsql" não iria funcionar)
Michael Mrozek