Comment puis-je concaténer une variable shell à d'autres autres paramètres dans mes lignes de commande?

16

Comment puis-je concaténer une variable shell à d'autres autres paramètres dans mes lignes de commande?

Par exemple,

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

Je dois concaténer .sqlà$WEBSITE

anévrisme
la source

Réponses:

26

Utilisez ${ }pour enfermer une variable.

Sans accolades:

VAR="foo"
echo $VAR
echo $VARbar

donnerait

foo

et rien, car la variable $VARbarn'existe pas.

Avec des accolades:

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

donnerait

foo
foobar

Joindre le premier $VARn'est pas nécessaire, mais une bonne pratique.

Pour votre exemple:

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

Cela fonctionne pour bash, zsh, ksh, peut - être d' autres aussi.

remuer
la source
3
Cela fonctionne pour toutes les coquilles de style Bourne (Bourne, POSIX, bash, ksh, zsh), les coquilles de style C (csh, tcsh), et même dans les poissons sans croisillons. C'est donc vraiment universel parmi les shells Unix. Je n'appellerais pas les accolades une bonne pratique. Mais j'appelle systématiquement en utilisant des guillemets doubles autour des bonnes pratiques de substitution de variables.
Gilles 'SO- arrête d'être méchant'
1
@ Gilles, j'irais plus loin et dirais que ne pas utiliser de guillemets doubles autour des substitutions de variables est une très mauvaise pratique.
Stéphane Chazelas
Faites également attention à ce que la ${ }concaténation ne soit en aucun cas. Par exemple, ELP=elp && echo $ELP && man --h${EPL}ne fonctionne pas.
foki
4

Concaténez simplement le contenu de la variable avec tout ce que vous voulez concaténer, par exemple

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

Les doubles guillemets ne sont pas liés à la concaténation: ici >$WEBSITE.sqlaurait également fonctionné. Ils sont nécessaires autour des extensions de variable lorsque la valeur de la variable peut contenir des caractères spéciaux du shell (espaces et \[?*). Je recommande fortement de mettre des guillemets doubles autour de toutes les extensions de variables et substitutions de commandes, c'est-à-dire toujours écrire "$WEBSITE"et "$(mycommand)".

Pour plus de détails, voir $ VAR vs $ {VAR} et pour citer ou ne pas citer .

Gilles 'SO- arrête d'être méchant'
la source
2

J'utilise habituellement des guillemets, par exemple echo "$WEBSITE.sql".

Vous pouvez donc l'écrire comme:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > "$WEBSITE.sql"
Gert
la source
3
Cela fonctionne car .n'est pas un caractère valide dans un nom de variable; voir la réponse de wag si vous voulez concaténer une chaîne qui commence par des caractères valides (par exemple, "$ WEBSITEsql" ne fonctionnerait pas)
Michael Mrozek