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

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.


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 .


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"

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.