Programmieren nach Flussdiagramm - Problem bei Ordnerstruktur vergleich

D

DarkAngelw

Jungspund
Hallo Zusammen

Ich bin hier neu und muss schon von beginn an sagen, dass ich ein ziemlicher Anfänger bin was das Scripten an geht. Hatte mal einen Kurs in Windowsscripting, da dieses Script, welches ich aber nun erstelle auf einem FreeBSD läuft, stosse ich schon bei meiner ersten Aufgabe an die Grenzen.

Deshalb möchte ich euch gerne bitten, vielleicht ein bisschen rücksicht auf Anfänger zu nehmen und fragen, ob ihr euch vielleicht das Flussdiagramm anschaut und mit dann sagt, wie ich dies am besten in Bash umsetze und ob der Anfangscode, welchen ich erstellt habe, einigermassen stimmt.

http://www.vinkestijn.ch/Flussdiagramm.gif

Nun zum Anfangscode welchen ich erstellt habe:
Code:
#!/bin/bash
reponame=hallo
vergleich=`find /usr/home/svn/repos/$reponame`
echo $vergleich > /usr/home/svn/repos/repolist.tmp

if [ `less /usr/home/svn/repos/repolist.tmp` = " " ]
then
        echo "repo wird hier erstellt werden"
else
        echo "repo schon vorhanden"
fi

exit 00

Jedoch erscheint danach folgende Fehlermeldung:
Code:
find: /usr/home/svn/repos/hallo: No such file or directory
[: =: unexpected operator
 
mh... dieses flussdiagram ist schon lustig^^

Ich hab zwar noch nie ein Script für die Bash geschrieben, aber ich glaube eines ist bei fast allen sprachen gleich:

Vergleichsoperatoren wie "gleich" werden mit == geschrieben, nicht =

Also :
if [ `less /usr/home/svn/repos/repolist.tmp` == " " ]

Wie gesagt, ich hab keine ahnung, aber das würde ich mal so von allen möglichen anderen sprachen her annehmen.

Und bei der Fehlermeldung "No such file or directory" würde ich einfach mal überprüfen obs, diesen ordner "hallo" wirklich gibt. Ich denke die Ausgabe ist eindeutig.
 
Hallo
Nein, das Problem ist hier nicht das =.
find gibt lediglich über <STDERR> aus, dass kein Verzeichnis gefunden wird.

Beim Vergleich ist der erste Teil folglich leer.

Wenn du nun mal schaust, wie die Shell Variablen auflöst, wird aus deinem Vergleich
Code:
if [ =" " ]
Was deine Shell als Fehler meldet, da ja beim Vergleich (Test) zwei Argumente erwartet werden.

Das regelst du besser mit:
Code:
vergleich=$(find /usr/home/svn/repos/$reponame 2>/dev/null)


if [ "x$vergleich" = "x" ]
then
        echo "repo wird hier erstellt werden weil \$vergleich leer"
else
        echo "repo schon vorhanden"
fi

exit

Ich habe mir dein Flussdiagramm nicht gründlich angesehen, aber es ist schon beinahe altmodisch und für mich bewundernswert, dass jemand sowas noch macht (bei kleinen Projekten).

So habe ich das vor 30 Jahren auch gelernt.

Gruß Wolfgang
PS Kleiner Tipp: verwende $(command) statt Backticks.
 
Hallo Wolfgang,

danke für deine Hilfe. Das funktioniert ja perfekt. Falls ich wieder an ein Problem treffe, melde ich mich wieder.

Und ja das ist halt noch alte Schule so nen Flussdiagramm, aber für das bin ich ja auch noch in der Ausbildung zur Informatikerin.

Liebe Grüsse
DarkAngelw
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

och, das erste mal gings, und jetzt nid mehr. warum nicht?

Code:
# Bildschirmflaeche leeren
clear

# Repository Informationen
echo "Wie soll das Repository heissen?"
echo -n "Repositoryname: "
read reposname

# Vergleichen mit schon vorhandenen Repositories
vergleich=$(find /usr/home/svn/repos/$reponame 2>/dev/null)


if [ "x$vergleich" = "x" ]
then
        echo "hallo welt"

else
        echo "schon vorhanden"

fi
 
Zuletzt bearbeitet:
Hallo Wolfgang,


.[/color]
och, das erste mal gings, und jetzt nid mehr. warum nicht?

Code:
# Bildschirmflaeche leeren
clear

# Repository Informationen
echo "Wie soll das Repository heissen?"
echo -n "Repositoryname: "
read repo[b][color=red]s[/color][/b]name

# Vergleichen mit schon vorhandenen Repositories
vergleich=$(find /usr/home/svn/repos/$[b]reponame[/b] 2>/dev/null)


if [ "x$vergleich" = "x" ]
then
        echo "hallo welt"

else
        echo "schon vorhanden"

fi

Wenn du meine Hervorhebung mal genau ansiehst, kommst du vermutlich auf den Fehler. ;)

Tipp:
Wenn du Verzeichnisse oder Dateien aus Usereingaben liest, ist es immer sinnvoll, diese auf Existens zu testen.
Code:
if [ -e "$DATEINAME" ];
then 
echo "$DATEINAME ist eine Datei"
else
echo "$DATEINAME ist keine Datei"
fi

Gruß Wolfgang
 
Zuletzt bearbeitet:
ok das könnte natürlich der fehler sein. sorry tut mir leid das ich gestört habe
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

und tatsächlich, ja das ist der fehler. und ich hab auch zu erst noch mein /dev/null kaputt gemacht, aber nun geht alles wieder.
 
Zuletzt bearbeitet:
ich habs gelöscht, aber es konnte mir gleich jemand dabei helfen.

und ja, nur ich kann das machen.
 
...das kommt davon, wenn die Frauen immer Ihre Always in den /dev/null werfen *duck und weg* :D :D :D
 
also ich hab das jetzt mal überhört.

Habe mein Script nun ein bisschen weiterentwickelt. Erhalte jedoch folgende Fehlermeldung:
Code:
/usr/home/svn/repos/repository.sh: 102: Syntax error: "(" unexpected (expecting "then")

Ich kann den Fehler aber nicht finden!!!!

Code:
#!/bin/bash

# ******************
# *** FUNKTIONEN ***
# ******************

repositoryname ()
{
        echo -n "Repositoryname: "
        read reponame
        vergleich_ifschleife
}

vergleich_ifschleife ()
{
        #Vergleichen mit schon vorhandenen Repositories
        vergleich=$(find /usr/home/svn/repos/$reponame 2>/dev/null)

        if [ "x$vergleich" = "x" ]
        then
                echo "Nun koennen Sie die User dazu erstellen (Diese User sind fuer je
des Repository eigenstaendig verwaltbar und stehen nicht in Verbindung mit dem FreeBSD
 System."
        else
                echo
                echo "Entweder haben sie keine Eingabe betaetigt oder ein Repository m
it diesem Namen ist schon vorhanden. Bitte geben Sie einen neuen Repositorynamen an."
                repositoryname
        fi
}

conffile_repo_loeschen ()
{
        rm -r /usr/home/svn/repos/passwd.tmp
        rm -r /usr/home/svn/repos/authz.tmp
        rm -r /usr/home/svn/repos/svnserve.tmp
}

user_erstellen ()
{
        echo -n "Username: "
        read user
        echo -n "Passwort: "
        echo "$user = $passwort" >> /usr/home/svn/repos/passwd.tmp
}

rechte_erstellen ()
{
        echo -n "Rechte auf Trunk (rw/r/none): "
        read trunk
        echo -n "Rechte auf Tags (rw/r/none): "
        read tags
        echo -n "Rechte auf Branches (rw/r/none): "
        read branches

        if [ "$trunk" != "rw" ]
        then
                if [ "$trunk" != "r" ]
                then
                        echo "trunknone = $user" >> /usr/home/svn/repos/authz.tmp
                else
                        echo "trunkr = $user" >> /usr/home/svn/repos/authz.tmp
                fi
        else
                echo "trunkrw = $user" >> /usr/home/svn/repos/authz.tmp
        fi

        if [ "$tags" != "rw" ]
        then
                if [ "$tags" != "r" ]
                then
                        echo "tagsnone = $user" >> /usr/home/svn/repos/authz.tmp
                else
                        echo "tagsr = $user" >> /usr/home/svn/repos/authz.tmp
                fi
        else
                echo "tagsrw = $user" >> /usr/home/svn/repos/authz.tmp
        fi

        if [ "$branches" != "rw" ]
        then
                if [ "$branches != "r" ]
                then
                        echo "branchesnone = $user" >> /usr/home/svn/repos/authz.tmp
                else
                        echo "branchesr = $user" >> /usr/home/svn/repos/authz.tmp
                fi
        else
                echo "branchesrw = $user" >> /usr/home/svn/repos/authz.tmp
        fi
}

svnserve_erstellen ()
{
        echo "[general]" >> /usr/home/svn/repos/svnserve.tmp
        echo "anon-access = none" >> /usr/home/svn/repos/svnserve.tmp
        echo "auth-access = passwd" >> /usr/home/svn/repos/svnserve.tmp
        echo "password-db = passwd" >> /usr/home/svn/repos/svnserve.tmp
        echo "authz-db = authz" >> /usr/home/svn/repos/svnserve.tmp
        echo "realm = $reponame" >> /usr/home/svn/repos/svnserve.tmp
}

weiterer_user ()
{
        echo -n "Moechten Sie noch einen weiteren User erstellen ? (y/n)"
        read usererstellen

        if [ "$usererstellen" = "y" ]
        then
                user_erstellen
                rechte_erstellen
                weiterer_user
        else
                echo "Sie haben nun alle noetigen Informationen eingegeben."
        fi
}

# **************
# *** Ablauf ***
# **************

# Bildschirmflaeche leeren
clear

# Repository Informationen
echo "Wie soll das Repository heissen? (Bitte verwenden Sie keine Sonder- und/oder Lee
rzeichen bei der Eingabe des Repositorynamens)"

repositoryname
conffile_repo_loeschen
echo "[users]" >> /usr/home/svn/repos/passwd.tmp
user_erstellen
echo "[groups]" >> /usr/home/svn/repos/authz.tmp
rechte_erstellen

exit 0

Vielleicht bin ich auch einfach nur zu Blind.
 
Hallo

Was steht denn in Zeile 102?
Ich habe jetzt keine Lust das durchzuzählen. ;)
Eventuell ja eine if Abfrage mit leerer Variable.

Kleiner Tipp:
Versuch mal ein cat -n datei dann bekommst du Zeilennummern.

Gruß Wolfgang

edit:
Noch ein Tipp:
Um Passwort blind (ohne echo) einzugeben, verwende
Code:
read -s var
-p gestattet sogar ein prompt.
 
Zuletzt bearbeitet:
Code:
        if [ "$branches" != "rw" ]
        then
                [b]if [ "$branches != "r" ][/b]
                then
                        echo "branchesnone = $user" >> /usr/home/svn/repos/authz.tmp
                else
                        echo "branchesr = $user" >> /usr/home/svn/repos/authz.tmp
                fi
        else
                echo "branchesrw = $user" >> /usr/home/svn/repos/authz.tmp
        fi

Vielleicht bin ich auch einfach nur zu Blind.

Folgefehler aus Zeile 82 ;-)
Bei so etwas ist das Syntax-Highlighting (falls Du vim o. ä. zum Editieren verwendest) ganz nützlich.

Gruß Daniel
 
Hallo

Was steht denn in Zeile 102?
Ich habe jetzt keine Lust das durchzuzählen. ;)
Eventuell ja eine if Abfrage mit leerer Variable.

Kleiner Tipp:
Versuch mal ein cat -n datei dann bekommst du Zeilennummern.

Gruß Wolfgang

edit:
Noch ein Tipp:
Um Passwort blind (ohne echo) einzugeben, verwende
Code:
read -s var
-p gestattet sogar ein prompt.

Zeile 102 ist:
Code:
 echo -n "Moechten Sie noch einen weiteren User erstellen ? (y/n)"

und deswegen komme ich ja nicht auf das Problem
 
Ähm,

Fallout hat dir doch den Fehler schon gezeigt?!

Code:
if [ "$branches != "r" ]

Da fehlt noch ein "
 
Hab ich gemacht, gibt genau die gleiche Fehlermeldung aus.
 
Hallo
Welchen Wert hat denn diese Variable?

Versuch mal den Trick mit x, überall dort wo die Var auch leer sein könnte.

Code:
if [ "x$branches" != "xrw" ]
        then
                if [ "x$branches" != "xr" ]
                then

Gruß Wolfgang
 
Hallo Wolfgang,

so wie es aussieht bin ich wohl der grösste volltrottel der welt.

Nochmals der aktuelle Code:
Code:
#!/bin/bash

# ******************
# *** FUNKTIONEN ***
# ******************

repositoryname ()
{
        echo -n "Repositoryname: "
        read reponame
}

vergleich_ifschleife ()
{
        #Vergleichen mit schon vorhandenen Repositories
        vergleich=$(find /usr/home/svn/repos/$reponame 2>/dev/null)

        if [ "x$vergleich" = "x" ]
        then
                echo "Nun koennen Sie die User dazu erstellen (Diese User sind fuer je
des Repository eigenstaendig verwaltbar und stehen nicht in Verbindung mit dem FreeBSD
 System."
        else
                echo
                echo "Entweder haben sie keine Eingabe betaetigt oder ein Repository m
it diesem Namen ist schon vorhanden. Bitte geben Sie einen neuen Repositorynamen an."
                repositoryname
        	vergleich_ifschleife
        fi
}

conffile_repo_loeschen ()
{
        rm -r /usr/home/svn/repos/passwd.tmp
        rm -r /usr/home/svn/repos/authz.tmp
        rm -r /usr/home/svn/repos/svnserve.tmp
}

user_erstellen ()
{
        echo -n "Username: "
        read user
        echo -n "Passwort: "
        echo "$user = $passwort" >> /usr/home/svn/repos/passwd.tmp
}

rechte_erstellen ()
{
        echo -n "Rechte auf Trunk (rw/r/none): "
        read trunk
        echo -n "Rechte auf Tags (rw/r/none): "
        read tags
        echo -n "Rechte auf Branches (rw/r/none): "
        read branches

        if [ "x$trunk" != "xrw" ]
        then
                if [ "x$trunk" != "xr" ]
                then
                        echo "trunknone = $user" >> /usr/home/svn/repos/authz.tmp
                else
                        echo "trunkr = $user" >> /usr/home/svn/repos/authz.tmp
                fi
        else
                echo "trunkrw = $user" >> /usr/home/svn/repos/authz.tmp
        fi

        if [ "x$tags" != "xrw" ]
        then
                if [ "x$tags" != "xr" ]
                then
                        echo "tagsnone = $user" >> /usr/home/svn/repos/authz.tmp
                else
                        echo "tagsr = $user" >> /usr/home/svn/repos/authz.tmp
                fi
        else
                echo "tagsrw = $user" >> /usr/home/svn/repos/authz.tmp
        fi

        if [ "x$branches" != "xrw" ]
        then
                if [ "x$branches" != "xr" ]
                then
                        echo "branchesnone = $user" >> /usr/home/svn/repos/authz.tmp
                else
                        echo "branchesr = $user" >> /usr/home/svn/repos/authz.tmp
                fi
        else
                echo "branchesrw = $user" >> /usr/home/svn/repos/authz.tmp
        fi
}

svnserve_erstellen ()
{
        echo "[general]" >> /usr/home/svn/repos/svnserve.tmp
        echo "anon-access = none" >> /usr/home/svn/repos/svnserve.tmp
        echo "auth-access = passwd" >> /usr/home/svn/repos/svnserve.tmp
        echo "password-db = passwd" >> /usr/home/svn/repos/svnserve.tmp
        echo "authz-db = authz" >> /usr/home/svn/repos/svnserve.tmp
        echo "realm = $reponame" >> /usr/home/svn/repos/svnserve.tmp
}

weiterer_user ()
{
        echo -n "Moechten Sie noch einen weiteren User erstellen ? (y/n)"
        read usererstellen

        if [ "x$usererstellen" = "xy" ]
        then
                user_erstellen
                rechte_erstellen
                weiterer_user
        else
                echo "Sie haben nun alle noetigen Informationen eingegeben."
        fi
}

# **************
# *** Ablauf ***
# **************

# Bildschirmflaeche leeren
clear

# Repository Informationen
echo "Wie soll das Repository heissen? (Bitte verwenden Sie keine Sonder- und/oder Lee
rzeichen bei der Eingabe des Repositorynamens)"

repositoryname
vergleich_ifschleife
conffile_repo_loeschen
echo "[users]" >> /usr/home/svn/repos/passwd.tmp
user_erstellen
echo "[groups]" >> /usr/home/svn/repos/authz.tmp
rechte_erstellen

exit 0

und somit auch die aktuelle Fehlermeldung:
Code:
/usr/home/svn/repos/repository.sh: 102: Syntax error: "(" unexpected (expecting "fi")

Habe noch kurz den Code geändert. Da ein Funktionsaufgriff falsch war. Der Fehler bleibt aber weiterhin.
 
Zuletzt bearbeitet:
Hi,

ich heiße zwar nicht Wolfgang, bin aber trotzdem so frei und schreibe nochmal etwas hierzu :D

Kein Grund zur Selbstdiskriminierung. Ich - und ich vermute auch mal einige andere - habe schon ganz anderen Bockmist gebaut, den ich erst nach Tagen entdeckt habe. So lange man dran bleibt und versucht daraus zu lernen, kann man einem auch nicht wirklich viel vorwerfen ;-)

An Deinem zuletzt zitierten Code kann ich selbst eigentlich keinen Fehler mehr feststellen. Ich habe ihn auch mal kurzerhand mit ausge"echo"ten Dateisystemzugriffen bei mir (bash 3.00.16) erfolgreich ausgeführt.
Dabei ist mir aber noch in Zeile 44 etwas aufgefallen, das Du vergessen hast:
user_erstellen ()
{
echo -n "Username: "
read user
echo -n "Passwort: "
read passwort
echo "$user = $passwort" >> /usr/home/svn/repos/passwd.tmp
}

Gruß Daniel
 
Hallo

Ich kann das hier schlecht nachvollziehen, aber möglicherweise kommst du ja weiter, wenn du das Script mal im Debugmodus laufen lässt.

Dazu die Shebang um -x erweitern.

Code:
#!/bin/bash -x

Das zeigt dir die Variablen an, ohne etwas auszuführen.

Übrigens ist deine Variable $passwort nicht gesetzt.
Auch die Recursion in der ersten Funktion ist nicht gerade glücklich gewählt.
Rüde ausgedrückt nennt sich soetwas Spaghetticode.


Gruß Wolfgang
 
das mit dem spagetti code, stimmt sicherlich schon.

Deswegen bin ich ja auch noch Anfänger hehe.

Werde mal die zwei Sachen anpassen und danach wieder schreiben.
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

hehe ich glaubs ja nicht.

das mit dem -x funktioniert irgendwie nicht, oder hab ich das vielleicht was falsch verstanden.

Da ich nun read passwort reingeschrieben habe, erscheint nun immer noch die gleiche Fehlermeldung nur einfach ne Zeile tiefer:
Code:
/usr/home/svn/repos/repository.sh: 103: Syntax error: "(" unexpected (expecting "fi")
 
Zuletzt bearbeitet:

Ähnliche Themen

HandbrakeCLI Shell Skript

Escaping-Problem

Doppelte Dateien löschen.

Backup Skript automatisch ausführen mit udev

verzeichnisse vergleichen

Zurück
Oben