Pro-Linux.de

Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 21. Nov 2018 2:43

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1 2 Nächste
Autor Nachricht
 Betreff des Beitrags: Shell-Skript-Programmierung
BeitragVerfasst: 25. Okt 2008 17:54 
Offline

Registriert: 06. Okt 2008 14:31
Beiträge: 35
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 25. Okt 2008 21:45 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 25. Okt 2008 22:13 
Offline

Registriert: 06. Okt 2008 14:31
Beiträge: 35
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 25. Okt 2008 23:39 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
$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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 26. Okt 2008 19:22 
Offline

Registriert: 06. Okt 2008 14:31
Beiträge: 35
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?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 26. Okt 2008 21:17 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 27. Okt 2008 8:54 
Offline

Registriert: 06. Okt 2008 14:31
Beiträge: 35
Super vielen Dank !!


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 10. Nov 2008 21:36 
Offline

Registriert: 06. Okt 2008 14:31
Beiträge: 35
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. :(


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Nov 2008 6:56 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Nov 2008 11:11 
Offline

Registriert: 06. Okt 2008 14:31
Beiträge: 35
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 11. Nov 2008 15:12 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 07. Dez 2008 16:34 
Offline

Registriert: 06. Okt 2008 14:31
Beiträge: 35
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


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 07. Dez 2008 19:30 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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 geändert von Janka am 07. Dez 2008 21:10, insgesamt 1-mal geändert.

Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 07. Dez 2008 19:52 
Offline

Registriert: 06. Okt 2008 14:31
Beiträge: 35
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 :?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 07. Dez 2008 21:13 
Offline
Benutzeravatar

Registriert: 11. Feb 2006 19:10
Beiträge: 3569
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.


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 21 Beiträge ]  Gehe zu Seite 1 2 Nächste

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de