Come posso concatenare una variabile di shell ad altri parametri nelle mie righe di comando?


16

Come posso concatenare una variabile di shell ad altri parametri nelle mie righe di comando?

Per esempio,

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

Ho bisogno di concatenare .sqla$WEBSITE

Risposte:


26

Utilizzare ${ }per racchiudere una variabile.

Senza parentesi graffe:

VAR="foo"
echo $VAR
echo $VARbar

darebbe

foo

e niente, perché la variabile $VARbarnon esiste.

Con parentesi graffe:

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

darebbe

foo
foobar

Racchiudere il primo $VARnon è necessario, ma è una buona pratica.

Per il tuo esempio:

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

Questo funziona per bash, zsh, ksh, forse anche gli altri.


3
Funziona con tutte le conchiglie in stile Bourne (Bourne, POSIX, bash, ksh, zsh), conchiglie in stile C (csh, tcsh) e persino nei pesci senza parentesi graffe. Quindi è davvero universale tra le shell unix. Non definirei le buone pratiche tra parentesi graffe. Ma io chiamo sistematicamente usando le doppie virgolette intorno alle buone sostituzioni variabili.
Gilles 'SO- smetti di essere malvagio' il

1
@Gilles, andrei oltre e direi che non usare doppie virgolette attorno alle sostituzioni variabili è una pessima pratica.
Stéphane Chazelas,

Inoltre, fai attenzione a ${ }non concatenare in alcun senso. Ad esempio, ELP=elp && echo $ELP && man --h${EPL}non funziona.
foki,

4

Concatena i contenuti delle variabili a qualsiasi altra cosa desideri concatenare, ad es

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

Le doppie virgolette non sono correlate alla concatenazione: anche qui >$WEBSITE.sqlavrebbe funzionato. Sono necessari intorno alle espansioni di variabili quando il valore della variabile potrebbe contenere alcuni caratteri speciali della shell (spazi bianchi e \[?*). Consiglio vivamente di mettere le virgolette doppie attorno a tutte le espansioni variabili e sostituzioni di comandi, ovvero scrivere sempre "$WEBSITE"e "$(mycommand)".

Per maggiori dettagli, vedi $ VAR vs $ {VAR} e per citare o non citare .


2

Di solito uso le virgolette, ad es echo "$WEBSITE.sql".

Quindi potresti scriverlo come:

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

3
Questo funziona poiché .non è un carattere valido in un nome di variabile; vedi la risposta di wag se vuoi concatenare una stringa che inizia con caratteri validi (es. "$ WEBSITEsql" non funzionerebbe)
Michael Mrozek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.