Wie kann ich eine Shell-Variable mit anderen Parametern in meinen Befehlszeilen verknüpfen?

16

Wie kann ich eine Shell-Variable mit anderen Parametern in meinen Befehlszeilen verknüpfen?

Beispielsweise,

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

Ich muss verketten .sqlzu$WEBSITE

aneuryzm
quelle

Antworten:

26

Verwenden Sie ${ }diese Option, um eine Variable einzuschließen.

Ohne geschweifte Klammern:

VAR="foo"
echo $VAR
echo $VARbar

Würde geben

foo

und nichts, weil die Variable $VARbarnicht existiert.

Mit geschweiften Klammern:

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

Würde geben

foo
foobar

Die erste $VARist nicht notwendig, aber eine gute Praxis.

Für Ihr Beispiel:

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

Dies funktioniert für bash, zsh, ksh, vielleicht auch andere.

wedeln
quelle
3
Dies funktioniert für alle Bourne-Shells (Bourne, POSIX, bash, ksh, zsh), C-Shells (csh, tcsh) und sogar für Fische ohne geschweifte Klammern. So ist es wirklich universell unter Unix-Shells. Ich würde die Zahnspange nicht als gute Übung bezeichnen. Aber ich benutze systematisch doppelte Anführungszeichen um Variablenersetzungen.
Gilles 'SO- hör auf böse zu sein'
1
@Gilles, würde ich noch weiter gehen und sagen , als nicht in doppelte Anführungszeichen Variablenersetzungen verwendet , ist sehr schlecht Praxis.
Stéphane Chazelas
Achten Sie auch darauf, dass ${ }keine Verkettung vorliegt. Zum Beispiel ELP=elp && echo $ELP && man --h${EPL}funktioniert nicht.
Foki
4

Verketten Sie einfach den Inhalt der Variablen mit dem, was Sie sonst noch verketten möchten, z

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

Die doppelten Anführungszeichen haben nichts mit Verkettung zu tun: Auch hier >$WEBSITE.sqlhätte es funktioniert. Sie werden bei Variablenerweiterungen benötigt, wenn der Wert der Variablen einige Shell-Sonderzeichen (Leerzeichen und \[?*) enthält. Ich empfehle dringend, alle Variablenerweiterungen und Befehlsersetzungen in doppelte Anführungszeichen zu setzen, dh immer schreiben "$WEBSITE"und "$(mycommand)".

Weitere Einzelheiten finden Sie unter $ VAR vs $ {VAR} und unter Zitieren oder Nichtzitieren .

Gilles 'SO - hör auf böse zu sein'
quelle
2

Normalerweise verwende ich Zitate, z echo "$WEBSITE.sql".

So könnte man es schreiben:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > "$WEBSITE.sql"
Gert
quelle
3
Dies funktioniert, da .ein Variablenname kein gültiges Zeichen enthält. Siehe Wag's Antwort, wenn Sie einen String verketten möchten, der mit gültigen Zeichen beginnt (zB "$ WEBSITEsql" würde nicht funktionieren)
Michael Mrozek