Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
 Registrieren
    Profil      Private Nachrichten   Login
Shell-Skript-Programmierung
Gehen Sie zu Seite 1, 2  Weiter
 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Felix2000



Anmeldungsdatum: 06.10.2008
Beiträge: 35

BeitragVerfasst am: 25. Okt 2008 17:54   Titel: Shell-Skript-Programmierung Antworten mit Zitat

Ich habe mir dazu das Buch "Einführung in die Bash-Shell" vom O´Reilly Verlag besorgt. Hier wird ein Codebeispiel im Buch durchgenommen, dass ich auch anhand der Erklärung im Buch nicht ganz verstehe.

Hier der Code:

Code:

pushd()
{
   dirname=$1
   DIR_STACK="$dirname ${DIR_STACK:-$PWD' '}"
   cd ${dirname:?"fehlender Verzeichnisname."}
   echo "$DIR_STACK"
}


Ich verstehe hier nicht ganz diese Zeile: DIR_STACK="$dirname ${DIR_STACK:-$PWD' '}"

Wie genau arbeiten hier $dirname und ${DIR_STACK:-$PWD' '} zusammen? Ich habe herausbekommen, dass DIR_STACK eine Umgebungsvariable ist. Vielleicht könnt ihr mir die Codezeile erklären?

Vielen Dank
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3451

BeitragVerfasst am: 25. Okt 2008 21:45   Titel: Antworten mit Zitat

dirname, DIR_STACK und PWD sind in diesem Skript Umgebungsvariablen. PWD ist eine von der Shell automatisch auf das aktuelle Verzeichnis gesetzte Variable.
${DIR_STACK:-$PWD' '} gibt den Inhalt der Variablen DIR_STACK zurück, falls diese gesetzt ist, sonst das Ergebnis des Ausdrucks $PWD' '.

Die bash-Manpage ist hier sehr hilfreich, da sind diese Auswerte-Konstrukte beschrieben.

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

Felix2000



Anmeldungsdatum: 06.10.2008
Beiträge: 35

BeitragVerfasst am: 25. Okt 2008 22:13   Titel: Antworten mit Zitat

Hallo Janka !

Danke für Dein Post! Am besten ich formuliere die Frage nochmal etwas um: Warum stehen $dirname und ${DIR_STACK:-$PWD' '} direkt hintereinander? Ist ${DIR_STACK:-$PWD' '} etwas eine Option für $dirname ? Ich verstehe nicht ganz wie das zu interpretieren ist?

Wie der Ausdruck ${DIR_STACK:-$PWD' '} innerhalb eines Skriptes ausgewertet wird, ist sehr gut im oreilly Buch beschrieben, aber leider nicht der gesamte Ausdruck "$dirname und ${DIR_STACK:-$PWD' '} "

Grüße
Felix
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3451

BeitragVerfasst am: 25. Okt 2008 23:39   Titel: Antworten mit Zitat

$dirname ist kein Befehl, sondern einfach der Inhalt der Variable "dirname". Schreibt man in der Shell Quotes ("), so wird alles in den Quotes als ein String interpretiert, Referenzen werden ausgewertet. Außer den Quotes gibt es auch noch die Ticks ('), diese begrenzen auch Strings, allerdings werden keine Referenzen dazwischen ausgewertet.

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

Felix2000



Anmeldungsdatum: 06.10.2008
Beiträge: 35

BeitragVerfasst am: 26. Okt 2008 19:22   Titel: Antworten mit Zitat

Ok danke Janka !

Mal was anderes: Gibt es eigentlich irgendwo eine brauchbare Internetseite, auf der viele Befehle inkl. der gültigen Reihenfolge ihrer Argumente aufgelistet und erklärt werden? Irgendwie finde ich es ziemlich undurchsichtig, mir die Grundlagen der Shell-Programmierung anzueignen.

Das folgende Kommando z.B.

Code:
find . -perm 600 -exec chmod g+rw {} \;


Hier steht ja die {} z.B. für die Liste, die find mir zurückgibt. Glaube ich zumindest. Wie gesagt solche Dinge würde ich gerne irgendwo nachlesen. Gibt es so etwas wie eine große Doku, die vielleicht ähnlich wie eine Beschreibung von diversen Klassen und Methoden bei Java aufgebaut ist?
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3451

BeitragVerfasst am: 26. Okt 2008 21:17   Titel: Antworten mit Zitat

Es gibt für fast jeden Befehl eine Handbuchseite. Diese erhältst du mit "man Befehl" oder im Konqueror über #Befehl. Oft gibt es auch eine Infoseite, diese erhältst du mit "info Befehl" oder im Konqueror über "##Befehl".

Außerdem kannst du Manpages im Internet lesen. Z.B. bei http://www.freebsd.org/cgi/man.cgi

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

Felix2000



Anmeldungsdatum: 06.10.2008
Beiträge: 35

BeitragVerfasst am: 27. Okt 2008 8:54   Titel: Antworten mit Zitat

Super vielen Dank !!
 
Benutzer-Profile anzeigen Private Nachricht senden

Felix2000



Anmeldungsdatum: 06.10.2008
Beiträge: 35

BeitragVerfasst am: 10. Nov 2008 21:36   Titel: Antworten mit Zitat

Hallo !

Hab nochmal eine Frage, wann genau muss ich in If, For oder While Schleifen mit den eckigen Klammern arbeiten? Manchmal finde ich Beispiele, wo eckige Klammern gesetzt sind und manchmal welche, wo darauf verzichtet wird. Sad
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3451

BeitragVerfasst am: 11. Nov 2008 6:56   Titel: Antworten mit Zitat

Die eckigen Klammern entsprechen dem in der Shell eingbauten Befehl "test" -- übrigens ein guter Grund, eigene Programme niemals "test" zu nennen.

Wenn $a gleich $b dann tu c kann man also z.B wie folgt schreiben:
Code:

if test "$a" = "$b"
then
  c
fi

if [ "$a" = "$b" ]
then
  c
fi

[ "$a" = "$b" ] && c

etc. etc.

Der test-Befehl macht etwas mit seinen Argumenten und liefert "0" oder "nicht 0" zurück. "if" seinerseits vergleicht nur auf "0" oder "nicht 0". Genauso macht das "&&".

Du kannst statt test auch jeden anderen Befehl nehmen, der "0" oder "nicht 0" zurückliefert. Üblicherweise liefern Befehle "0" zurück, wenn sie erfolgreich beendet werden konnten. Oft gesehenes Beispiel
Code:

$ ./configure && make && sudo make install

Also ./configure ausführen, falls dies geklappt hat, make ausführen, falls dies geklappt hat sudo make install ausführen.

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

Felix2000



Anmeldungsdatum: 06.10.2008
Beiträge: 35

BeitragVerfasst am: 11. Nov 2008 11:11   Titel: Antworten mit Zitat

Vielen Dank ! Das muss man erstmal wissen ! Wie genau verhält sich denn der "test" wenn ich versuche mit Negationen zu arbeiten? Also bspw.

Code:
if ! [ $a && $b ] then

blabla


oder so

Code:
if  [ ! $a && $b ] then

blabla


Muss die then-Anweisung eigentlich immer auf der Höhe der If Anweisung stehen?

Grüße
Felix
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3451

BeitragVerfasst am: 11. Nov 2008 15:12   Titel: Antworten mit Zitat

Es geht beides, da "!" ebenfalls ein Kommando ist. Es wertet das nachfolgende Kommando aus und macht aus "0" "nicht 0", und umgekehrt. Im test-Kommando ist ! wird als Negationsoperator ausgewertet.
Code:

$ ! true ; echo $?
$ ! false ; echo $?

then kann auch auf einer eigenen Zeile stehen. Probier es doch einfach aus!

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

Felix2000



Anmeldungsdatum: 06.10.2008
Beiträge: 35

BeitragVerfasst am: 07. Dez 2008 16:34   Titel: Antworten mit Zitat

Hallo Janka !

Ich muss dich nochmal etwas fragen. Ich habe in vielen Shell Skripten gesehen, dass Variablen oft so geschrieben werden, bspw. in Testbefehlen, IF Anweisungen, while Schleifen usw.

"$@" oder so "$dirname" oder so "$2"

Hier nochmal zwei weitere Beispiele:

Code:
if [ -d "$2" ]
then

blabla

fi


oder

Code:
if [ -r "$1" ]
then

blabla

fi


Warum maskiert man manche Variablen so? Was genau habe ich davon für einen Nutzen? Ich gehe davon aus, dass es sich um Variablen in irgendwelchen Shellskripten handelt.

Viele Grüße
Felix
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3451

BeitragVerfasst am: 07. Dez 2008 19:30   Titel: Antworten mit Zitat

Sinnvoll ist das nur beim Vergleichen zweier Werte. Wenn die Variable den Leerstring enthält oder einfach nicht definiert ist meckert "test" nämlich sonst rum, dass es nur einen einzigen Parameter hätte.

$ A=
$ [ $A = X ]
bash: [: =: unary operator expected

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.


Zuletzt bearbeitet von Janka am 07. Dez 2008 21:10, insgesamt 1-mal bearbeitet
 
Benutzer-Profile anzeigen Private Nachricht senden

Felix2000



Anmeldungsdatum: 06.10.2008
Beiträge: 35

BeitragVerfasst am: 07. Dez 2008 19:52   Titel: Antworten mit Zitat

Ok, aber es ist auch nicht grundsätzlich falsch, wenn ich mit maskierten Variablen arbeite!? Mal davon abgesehen, ob es sinnvoll ist oder nicht. Tut mir leid, dein Beispiel verstehe ich nicht ganz Confused
 
Benutzer-Profile anzeigen Private Nachricht senden

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3451

BeitragVerfasst am: 07. Dez 2008 21:13   Titel: Antworten mit Zitat

Wenn du grundsätzlich "" drummachst, passiert bei "test" zumindest nichts Schlimmes. Es zeigt aber dem Leser des Skriptes, dass der Ersteller keine Ahnung hat, was er tut und warum.

Wenn du das Beispiel nicht verstehst, probier das Gegenbeispiel:

$ A=
$ [ "$A" = X ]

Hier gibt es nämlich *keine* Fehlermeldung.

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Gehen Sie zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy