If Anweisung in einer If anweisung usw

X

xXNemesisXx

Hi,
ich habe da ein kleines problem!
denn ich sehe vor lauter "if" und "[]" den Wald nicht mehr!

Ich habe eine Variable die dank eines Menüfeldes nur 3 verschiedene Werte haben kann!

tar ODER tar.gz ODER tar.bz2

von links nach rechts möchte ich das
wenn die Variable "lbu_type" den wert tar hat (lbu_type == 'tar')...
Die Shell diesen Befehl abarbeitet.

tar -cf ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}

wenn (lbu_type == 'tar.gz')

tar -cfz ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}

wenn (lbu_type == 'tar.bz2')

tar -cfj ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}

wem es nicht auffällt es ändern sich immer nur die Optinen -cf für tar -cfz für gzip und -cfj für bz2

Also sind es 3 if anweisungen in einer (so zusagen!)

Mit 2 habe ich kein Problem, aber bei drei spuckt er mir fehlermeldungen entgegen!

Könnte jemand helfen?
 
"Case" oder "Switch" ist da die richtige Wahl.

An sonsten:

Für gewöhnlich hilft eine vernünftige Formatierung Wunder. Meistens werden die Befehle innerhalb einer if-Abfrage eingerückt (z.B. 2 Zeichen nach rechts). Gibt es verschachtelte if-Abfragen, werden diese auch eingerückt, und deren Befehle auch. Vereinfacht gesagt ungefähr so:
Code:
if(blabla)
{
  Befehl1;
  if(lala)
  {
    Befehl3;
    if(gugu)
    {
      Befehl11;
    }
  }
  Befehl4;
}
 
ömmm nicht ganz verstanden hab -.-

Code:
if (lbu_type == 'tar')
{
	Befehl1;
	if (lbu_type == 'tar.gz')
	{
		tar -cfz ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
		mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
		if (lbu_type == 'tar.bz2')
		{
			tar -cfj ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
			mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
		}
	}
	tar -cf ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
	mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
}

Ergebnis:
./mysql: line 21: syntax error near unexpected token `}'
./mysql: line 21: ` }'
 
ömmm nicht ganz verstanden hab -.-

Code:
if (lbu_type == 'tar')
{
	Befehl1;
	if (lbu_type == 'tar.gz')
	{
		tar -cfz ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
		mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
		if (lbu_type == 'tar.bz2')
		{
			tar -cfj ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
			mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
		}
	}
	tar -cf ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
	mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
}

Ergebnis:

  1. Meckert hier mysql, was in deinem Code-Auszug nicht vorkommt.
  2. Was soll das hier für ein Vergleich sein?
    Code:
    if (lbu_type == 'tar')
  3. Von welcher Shell ist hier die Rede?
 
ne die datei heisst mysql...


Code:
#!/bin/sh
# Datenbank abfragen
lbu_speicher=`echo "SELECT lbu_verz FROM last_backup" | mysql -u Blubber --password=NARV BackUp`
lbu_ort=`echo "SELECT lbu_ort FROM last_backup" | mysql -u Blubber --password=NARV BackUp`
lbu_name=`echo "SELECT lbu_name FROM last_backup" | mysql -u Blubber --password=NARV BackUp`
lbu_name=`echo "SELECT lbu_type FROM last_backup" | mysql -u Blubber --password=NARV BackUp`
# Wechsel ins Verzeichnis
cd /var/www
# Erstelle BackUp Archiv
if (lbu_type == 'tar')
{
	Befehl1;
	if (lbu_type == 'tar.gz')
	{
		tar -cfz ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
		mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
		if (lbu_type == 'tar.bz2')
		{
			tar -cfj ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
			mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
		}
	}
	tar -cf ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
	mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
}

das ist der zeit das komplette script
 
ne die datei heisst mysql...


Code:
#!/bin/sh
# Datenbank abfragen
lbu_speicher=`echo "SELECT lbu_verz FROM last_backup" | mysql -u Blubber --password=NARV BackUp`
lbu_ort=`echo "SELECT lbu_ort FROM last_backup" | mysql -u Blubber --password=NARV BackUp`
lbu_name=`echo "SELECT lbu_name FROM last_backup" | mysql -u Blubber --password=NARV BackUp`
lbu_name=`echo "SELECT lbu_type FROM last_backup" | mysql -u Blubber --password=NARV BackUp`
# Wechsel ins Verzeichnis
cd /var/www
# Erstelle BackUp Archiv
if (lbu_type == 'tar')
{
	Befehl1;
	if (lbu_type == 'tar.gz')
	{
		tar -cfz ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
		mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
		if (lbu_type == 'tar.bz2')
		{
			tar -cfj ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
			mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
		}
	}
	tar -cf ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
	mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
}

das ist der zeit das komplette script

Das hier ist kein variablenname:
Code:
[B]${lbu_name//lbu_name}[/B]
Sondern in der Bash eine Ersetzung. Entferne alle Vorkommen von lbu_name" im Inhalt der Variable $lbu_name. Willst du das wirklich?
Code:
if (lbu_type == 'tar.gz')
In der Bash
Code:
if [ $lbu_type = "string" ]; then
...
fi


Aber du hast nicht auf die Frage bzw Rules in diesem Forum geachtet:
Welches OS welche Shell!
Das sieht jedenfalls nicht nach Bash oder ksh aus.
 
Hä?
Ich will doch nur eine Variable die die werte tar ODER tar.gz ODER tag.bz2 haben KANN auswerten und wenn die Variable den wert tar hat soll sie das machen... wenn sie den wert tar.gz hat dieses und wenn tar.bz2 dran ist soll sie das machen...!

Ich habe Debian Etch und laut dem Kommentar ganz oben in meinen Script ist es die sh shell!
 
/bin/sh könnte dash sein und theoretisch könnte man hier auch mit elif arbeiten.

Code:
if [ $lbu_type = "tar.gz" ] ; then
...
elif [ $lbu_type = "tar.bz2" ] ; then
...
elif ...
fi
 
Zuletzt bearbeitet:
Hä?
Ich will doch nur eine Variable die die werte tar ODER tar.gz ODER tag.bz2 haben KANN auswerten und wenn die Variable den wert tar hat soll sie das machen... wenn sie den wert tar.gz hat dieses und wenn tar.bz2 dran ist soll sie das machen...!

Ich habe Debian Etch und laut dem Kommentar ganz oben in meinen Script ist es die sh shell!

/bin/sh kann dash bash ash ksh ... theoretisch alles sein.
Deine Syntax da oben ist aber falsch.
Das sieht eher nach perl oder so aus.
Siehe mein vorletztes Posting.

Vergleich (String ) in der Bash:
Code:
if [ "$var" = "teststring" ]; then 
command;
...
fi
 
@Wolfgang:
Das war nur ein theoretisches Beispiel, wie man durch Einrücken Übersichtlichkeit gewinnt. Das solltest Du nicht 1:1 auf deinen Code übertragen.
 
/bin/sh kann dash bash ash ksh ... theoretisch alles sein.
Hast ja recht :D

Kubuntu:
Code:
$ ll /bin/sh
lrwxrwxrwx 1 root root 4 2007-10-26 01:38 /bin/sh -> dash

Debian:
Code:
$ ll /bin/sh
lrwxrwxrwx 1 root root 4 2007-12-09 13:42 /bin/sh -> bash
 
@Wolfgang:
Das war nur ein theoretisches Beispiel, wie man durch Einrücken Übersichtlichkeit gewinnt. Das solltest Du nicht 1:1 auf deinen Code übertragen.

ich habe überhaupt nichts übertragen. ;)

Aber was nützt Einrücken, wenn die Syntax nicht richtig ist?:devil:
Dann hast du allenfalls übersichtlichen nicht funktionierenden Code. :D
 
HALLLO???

Ihr macht mich fertig! :oldman

Code:
if	[$lbu_type == 'tar'];	then
	tar -cf ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
	mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
elif	[$lbu_type == 'tar.gz'];	then
	tar -cfz ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
	mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
elif	[$lbu_type == 'tar.bz2'];	then
	tar -cfj ${lbu_name//lbu_name} ${lbu_speicher//lbu_verz}
	mv ${lbu_name//lbu_name} ${lbu_ort//lbu_ort}
fi

das ist nun der Code

Und die Fehlermeldung ist diese:

./mysql: line 10: [: missing `]'
./mysql: line 13: [: missing `]'
./mysql: line 16: [: missing `]'

wieso gebt ihr mir beispiele die sowie so nicht gehen!
 
@Wolfgang:

Ups, da habe ich den falschen angesprochen. Meinte eigentlich xXNemesisXx.

Übersichtlicher Code lässt sich einfacher nach Fehlern untersuchen. Wenn man schon nicht sehen kann, welche Klammer wo geschlossen wird, dann wird die Fehlersuche zu einer Qual.
 
Leerzeichen nach und vor der eckigen Klammer vergessen.
Also so dann [ $lbu_type == 'tar' ]

Edit: Hab das in dem andern Post mal korrigiert.
 
Zuletzt bearbeitet:
HALLLO???

Ihr macht mich fertig! :oldman

Code:
if	[$lbu_type == 'tar'];	then


Und die Fehlermeldung ist diese:

./mysql: line 10: [: missing `]'
./mysql: line 13: [: missing `]'
./mysql: line 16: [: missing `]'

wieso gebt ihr mir beispiele die sowie so nicht gehen![/QUOTE]

Weil du nicht richtig liest!
Die Shell ist sehr genau in der Syntax.
z.B. muss die Klammer immer von Leerzeichen umschlossen sein.
Das steht auch in der man bash so!

[code]
if [ $var = "String" ]; then ...fi
Damit stimmt die Syntax, aber es wird nicht das rauskommen, was du erwartest.
Das trifft nur zu, wenn der gesamte String tar lautet.
Um z.B. nur das nach dem letzten Punkt zu vergleichen:
Code:
if [ "$lbu_type##?*\.}" = "tar" ];then
...
fi
if [ "$lbu_type##?*\.}" = "gz" ];then
...
fi
if [ "$lbu_type##?*\.}" = "bz2" ];then
...
fi

Und dann schau dir nochmal deine Variablennamen an.
Das // im Namen bewirkt nicht das was du willst.
Siehe mein Hinweis oben!
Sonst wird das Nichts.

Wolfgang
 
Es geht nicht! ich hab die klammern jetzt in die Zeilen eingesetzt und dennoch kommt der fehler

kann mir nicht einfach sagen wo der fehler ist?
 
Es geht nicht! ich hab die klammern jetzt in die Zeilen eingesetzt und dennoch kommt der fehler

kann mir nicht einfach sagen wo der fehler ist?

Sorry, aber ich habe dir genau gezeigt wie es geht.
Ich habe dir auch etwas zu deinen Variablennamen gesagt.
Und
ist keine Fehlermeldung.
Was erwartest du noch?

Beispiel:
Code:
$ a=file.tar; 
if [ ${a##?*\.} = "tar" ];then 
echo tar;
fi
tar
 
Nach dem Semikolon muss noch ein Leerzeichen, sonst meckert die Bash wieder.
 

Ähnliche Themen

Shell vs. PHP

Eure .zshrc

problem mit rsync shell-script

Jaunty + Zend + Gdata + xampp

"bash-2.05b $ :() { :|: & } ; :" in screen: 39 bash-Fenster

Zurück
Oben