Variable definieren in Variable

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
tempes2k
Beiträge: 15
Registriert: 21.09.2011 17:14:47

Variable definieren in Variable

Beitrag von tempes2k » 24.09.2013 20:58:42

Hallo Leute,

ist es möglich folgendes zu definieren:
Quasi eine Variable in einer Variable...?

VHOSTFOLDER=/var/www/vhosts/
SQLDIR=$VHOSTFOLDERsqldump/

ich denke hier muss noch ein Anführungszeichen hin oder?

Über einen Tipp freue ich mich
vielen Dank

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Re: Variable definieren in Variable

Beitrag von peschmae » 24.09.2013 21:08:14

Kommt drauf an was du genau willst.

Je nach dem:

Code: Alles auswählen

$ VHOSTFOLDER=/var/www/vhosts/

$ SQLDIR=${VHOSTFOLDER}sqldump/; echo $SQLDIR
/var/www/vhosts/sqldump/
$ SQLDIR="${VHOSTFOLDER}sqldump/"; echo $SQLDIR
/var/www/vhosts/sqldump/

$ SQLDIR='${VHOSTFOLDER}sqldump/'; echo $SQLDIR
${VHOSTFOLDER}sqldump/
Beim ersten wird die Variable ersetzt, beim zweiten auch - aber das zweite funktioniert auch wenn VHOSTFOLDER Leerzeichen enthält, beim dritten wird die Variable nicht ersetzt wiel durch die einfachen ' geschützt (kann nützlich sein wenn man das z.B. erst später oder anderswo ersetzen lassen will).

Das ${} Konstrukt brauchts weil der Shell sonst unklar ist, wann der Variablenname zuende ist. (Normalerweise beim nächsten space oder /, aber nicht mitten im Wort)

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

tempes2k
Beiträge: 15
Registriert: 21.09.2011 17:14:47

Re: Variable definieren in Variable

Beitrag von tempes2k » 24.09.2013 21:13:12

super genial, habe alles verstanden.

Habe mich erst kürzlich mit Shellprogrammierung auseinandergesetzt und bin eben noch bei den absoluten "Basics"
...
vielen DANK!

tempes2k
Beiträge: 15
Registriert: 21.09.2011 17:14:47

Re: Variable definieren in Variable

Beitrag von tempes2k » 24.09.2013 22:02:16

Hallo,

ich bins nochmal. Habe mein Script nach deinen Tipps verfeinert.
allerdings gibt es beim "Zielverzeichnis" irgendwie Problem.
Ich erhalte immer die Meldung:

./script.sh: line 45: {/var/www/vhosts/sqldump/}: No such file or directory

#!/bin/bash

# zu sichernder vhost...
VHOSTFOLDER=/var/www/vhosts/
# SQLdir sollte im vhost liegen
SQLDIR=${VHOSTFOLDER}sqldump/
LOG=/root/script.log

mysqldump -u ${USER1} -p${PW1} $DB1 > "{$SQLDIR}""${Ziel1}" >> $log
mysqldump -u ${USER2} -p${PW2} $DB2 > "{$SQLDIR}""${Ziel2}" >> $log

# Übertragen der DATEN inkl. DATENBANKEN
rsync -rahHpz --progress --compress-level=8 --stats ${VHOSTFOLDER} root@${REMOTE} >> $log

und das Logfile wurde auch nicht erzeugt.. ?
Hoffe nochmals auf ein paar Tipps, vielen Dank

Benutzeravatar
habakug
Moderator
Beiträge: 4313
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable definieren in Variable

Beitrag von habakug » 24.09.2013 22:15:06

Hallo!

Hier musst du die Klammern weglassen und aus

Code: Alles auswählen

mysqldump -u ${USER1} -p${PW1} $DB1 > "{$SQLDIR}""${Ziel1}" >> $log
das

Code: Alles auswählen

mysqldump -u ${USER1} -p${PW1} $DB1 > "$SQLDIR""${Ziel1}" >> $LOG
machen. Dann loggt das auch.

Gruß, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Variable definieren in Variable

Beitrag von uname » 24.09.2013 22:50:36

Generell zu der Programmierung. Wäre es evtl. nicht besser $VHOSTFOLDER ohne Slash am Ende zu definieren und den Rest umzuprogrammieren? Dann könnte man an einigen Stellen evtl. {} weglassen.

tempes2k
Beiträge: 15
Registriert: 21.09.2011 17:14:47

Re: Variable definieren in Variable

Beitrag von tempes2k » 24.09.2013 22:57:05

Hallo ja generell wäre das sicher sinnvoll..
hatte mal gelesen, dass es eindeutiger wäre wenn man den Slash macht, das es sich um einen kompletten Pfad handelt.. aber ich kanns noch umbauen.-..

jetzt ein erneutes kleines Problem:

Nachm Doppelpunkt wird mir der ZIELPFAD einfach nicht angezeigt der ist immer "leer"
lasse mir den Zielpfad ausgeben mit

REMOTE=server.1.de:${ZIELPFAD}

echo $REMOTE
server.1.de:

gibt es irgendwie eine Ausnahme nach Doppelpunkt ?
Auch: REMOTE=server.1.de:$ZIELPFAD

für zu

echo $REMOTE
server.1.de:

freue mich über antworten..

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Variable definieren in Variable

Beitrag von uname » 25.09.2013 08:02:34

Doppelpunkt hat keine Besonderheiten. Aber ${ZIELPFAD} bzw. $ZIELPFAD wird leer sein.

Lass doch vorher einfach per

Code: Alles auswählen

echo ${ZIELPFAD}
den Wert ausgeben. Wahrscheinlich ist aber eher der Name ZIELPFAD falsch als der Inhalt. Wie ist der korrekt Code?

PS.: Poste bitte zukünftig korrekte Beispiele aus deinem vollständigen Script. Hierbei lösche alles unwichtige, was nicht unmittelbar zum Thema gehört. Dann kann man das Script auch leicht ausprobieren.

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: Variable definieren in Variable

Beitrag von Phineas » 25.09.2013 10:35:10

Man erspart sich viel Ärger, wenn man konsequent alle Strings in Anführungszeichen einschließt und immer geschweifte Klammern benutzt.

Code: Alles auswählen

SERVER="server.1.de"
ZIELPFAD=":test/"
REMOTE="${SERVER}${ZIELPFAD}"
Das ist zwar oft überflüssig, aber so gut wie nie falsch.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Variable definieren in Variable

Beitrag von Meillo » 25.09.2013 10:47:35

Phineas hat geschrieben:Man erspart sich viel Ärger, wenn man konsequent alle Strings in Anführungszeichen einschließt
Dem schliesse ich mich an, wenn man auch manchmal nicht quoten darf, wie z.B. bei:

Code: Alles auswählen

list="a b c"
for i in $list ; do ... done
und immer geschweifte Klammern benutzt.

Code: Alles auswählen

SERVER="server.1.de"
ZIELPFAD=":test/"
REMOTE="${SERVER}${ZIELPFAD}"
Das ist zwar oft überflüssig, aber so gut wie nie falsch.
Da bin ich anderer Meinung. Ich glaube, dass man durch zu viel unnoetige Zeichen die Ausdrucksfaehigkeit von Code reduziert. Wenn man das Rauschen (= unnoetige Information) erhoeht wird es zunehmend schwieriger das Signal (= relevante Information) zu erfassen. Daher: So wenig wie moeglich; so viel wie noetig.

Viel wichtiger finde ich allerdings den Rat Variablen mit Kleinbuchstaben zu benennen. Grossbuchstabige Variablennamen lesen sich deutlich schwerer und stellen in der Shell den Namenraum der vordefinierten Variablen dar. Der Nutzer/Programmierer sollte kleinbuchstabige Variablennamen verwenden um Kollisionen zu vermeiden.
Use ed once in a while!

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: Variable definieren in Variable

Beitrag von Phineas » 25.09.2013 11:08:52

Meillo hat geschrieben:Ich glaube, dass man durch zu viel unnoetige Zeichen die Ausdrucksfaehigkeit von Code reduziert.
Ich bleibe bei meiner Meinung.
Das:

Code: Alles auswählen

REMOTE="${SERVER}String${ZIELPFAD}"
ist leichter verständlich als das:

Code: Alles auswählen

REMOTE="${SERVER}String$ZIELPFAD"
Zu Groß/Kleinbuchstaben habe ich auch meine eigene Meinung. Groß sind ENV-Varis, klein sind Befehle, also benutze ich bei Varis einen Großbuchstaben am Anfang (Server="...").

Aber gut: Das bleibt wohl Geschmacksache. Wichtig ist, dass man sich konsequent an seine Standards hält (falls man kein Profi ist, der seine Codes mit mit anderen Programmierern zusammen entwickelt, dann hält man sich eh an gegebene Standards).

Antworten