Hi alle, hier habe ich einen Prototyp eines Skriptes: count=0 if ls then ((count+=1)) fi if [[ $count ]] then echo fehlt else echo erfolgreich fi Das Problem ist nun, dass ich die Ausgabe "fehlt" bekomme, auch wenn `ls` erfolgreich ist. Warum? Gruß
Hallo On Tuesday 27 May 2003 15:43, OS2-Fan wrote:
hier habe ich einen Prototyp eines Skriptes:
count=0
if ls then ((count+=1)) fi
Bis hierhin ist es klar: Wenn ls ne 0 zurückgibt hat count den Wert 1 sonst 0.
if [[ $count ]] Das geht so nicht. Der "Wert" der Variable kann nicht so zum Rückgabewert eines Kommandos umfunktioniert werden. Es muss heißen "if [[ $count == "0" ]]" oder auch "if [[ $count == 0 ]]" Wann man "" oder '' braucht und wann nicht weiß ich nie so ganz genau, ich mache daher bei allen Strings Anführungszeichen dran.
Beispielskript test.sh (die veränderungen am ls sind nicht wesentlich): <======== #/bin/bash count=0 if `ls $1 >/dev/null` then ((count+=1)) fi if [[ $count == "0" ]] then echo fehlt else echo erfolgreich fi ======> Bash-Fenster: <====== axel@b122:~/test> ./test.sh /home erfolgreich axel@b122:~/test> ./test.sh /xyz ls: /xyz: Datei oder Verzeichnis nicht gefunden fehlt ======> mfg Axel
On Tue, 27 May 2003, Axel Heinrici wrote:
On Tuesday 27 May 2003 15:43, OS2-Fan wrote:
if [[ $count ]] Das geht so nicht. Der "Wert" der Variable kann nicht so zum Rückgabewert eines Kommandos umfunktioniert werden.
Der Fehler liegt woanders: "[[ $count ]]" ist äquivalent zu "[[ -n $count ]]", und das ist keine Abfrage des numerischen Wertes, sondern der Stringlänge - und die ist in diesem Fall immer unleich 0.
Es muss heißen "if [[ $count == "0" ]]" oder auch "if [[ $count == 0 ]]"
Das funktioniert natürlich, aber "ganz korrekt" wäre: "if [[ $count -eq 0 ]]", da "count" zuvor schon numerisch (und nicht als String) behandelt wurde. ('tschuldigung, bin nunmal ein Pedant... ;-)) Martin
OS2-Fan wrote:
Hi alle,
hier habe ich einen Prototyp eines Skriptes:
count=0
if ls then ((count+=1)) fi
if [[ $count ]] then echo fehlt else echo erfolgreich fi
Das Problem ist nun, dass ich die Ausgabe "fehlt" bekomme, auch wenn `ls` erfolgreich ist.
Warum?
Wenn es Dir um den Rückgabewert von ls geht, warum benutzt Du nicht "$?" ? Diese Variable enthält immer den Rückgabewert des letzten ausgeführten Kommandos. Beispiel: ls if [ $? -ne 0 ]; then echo "Fehler" else echo "Erfolg" fi -- Mit freundlichen Grüssen Stefan Weßels Bildungsakademie im Palais Bückeburg - Aussenstelle Hannover - Vahrenwalder Str. 294 30179 Hannover Tel.: +49-511-3749168 Fax: +49-511-67664814 Mailto: Stefan.Wessels@ba-palais.de
* Stefan Weßels schrieb am 28.Mai.2003:
OS2-Fan wrote:
Merkwürdiger Name.
hier habe ich einen Prototyp eines Skriptes:
count=0
if ls then ((count+=1)) fi
if [[ $count ]] then echo fehlt else echo erfolgreich fi
Das Problem ist nun, dass ich die Ausgabe "fehlt" bekomme, auch wenn `ls` erfolgreich ist.
Versuch mal if test $count -gt 0 Siehe hierzu auch man test
Wenn es Dir um den Rückgabewert von ls geht, warum benutzt Du nicht "$?" ? Diese Variable enthält immer den Rückgabewert des letzten ausgeführten Kommandos. Beispiel:
ls if [ $? -ne 0 ]; then echo "Fehler" else echo "Erfolg" fi
*AGRRRRRRRR* Entschuldige, aber gib hier bitte nicht so blödsinnige Ratschläge. Was der Mensch mit dem komischen Namen gemacht hat, ist an der Stelle genau richtig. if erwartet einen Befehl und wertet dessen Rückgabewert aus. Dabei gilt 0 als wahr und alles andere als falsch. Ein solcher Befehl ist auch test, oder auch [ .. ] was nur ein Synonym zu test ist. [ ist ein Befehl und kein Syntaxbestandteil der shell, darüber sollte man sich im Klaren sein. Du rufst einen Befehl auf und beachtest den Rückgabewert nicht, dann rufst Du nach if einen weitern Befehl auf, der nichts anderes macht, als den Rückgabewert des leten Befehls nochmal rückzugeben. Nicht sonderlich sinnig. Was OS2-Fan gemacht hat ist schon richtig. Allerdings wüßte ich nicht, wie ls ohne Argument was anderes als eine 0 zurückgeben könnte. ls gibt nur dann eine 1 zurück, wenn das Verzeichnis, daß als Argument mitgegeben wird, nicht existiert. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
Bernd Brodesser wrote:
* Stefan Weßels schrieb am 28.Mai.2003:
OS2-Fan wrote:
Merkwürdiger Name.
hier habe ich einen Prototyp eines Skriptes:
count=0
if ls then ((count+=1)) fi
if [[ $count ]] then echo fehlt else echo erfolgreich fi
Das Problem ist nun, dass ich die Ausgabe "fehlt" bekomme, auch wenn `ls` erfolgreich ist.
Versuch mal
if test $count -gt 0
Siehe hierzu auch man test
Wenn es Dir um den Rückgabewert von ls geht, warum benutzt Du nicht "$?" ? Diese Variable enthält immer den Rückgabewert des letzten ausgeführten Kommandos. Beispiel:
ls if [ $? -ne 0 ]; then echo "Fehler" else echo "Erfolg" fi
*AGRRRRRRRR*
Entschuldige, aber gib hier bitte nicht so blödsinnige Ratschläge. Was der Mensch mit dem komischen Namen gemacht hat, ist an der Stelle genau richtig. if erwartet einen Befehl und wertet dessen Rückgabewert aus. Dabei gilt 0 als wahr und alles andere als falsch.
Ein solcher Befehl ist auch test, oder auch [ .. ] was nur ein Synonym zu test ist. [ ist ein Befehl und kein Syntaxbestandteil der shell, darüber sollte man sich im Klaren sein.
Du rufst einen Befehl auf und beachtest den Rückgabewert nicht, dann rufst Du nach if einen weitern Befehl auf, der nichts anderes macht, als den Rückgabewert des leten Befehls nochmal rückzugeben. Nicht sonderlich sinnig.
Was OS2-Fan gemacht hat ist schon richtig. Allerdings wüßte ich nicht, wie ls ohne Argument was anderes als eine 0 zurückgeben könnte. ls gibt nur dann eine 1 zurück, wenn das Verzeichnis, daß als Argument mitgegeben wird, nicht existiert.
Bernd
Ich lerne immer gerne dazu. Aber wurde "$?" nicht nur zum Zweck der Auswertung des Rückgabewertes implementiert ? -- Mit freundlichen Grüssen Stefan Weßels Bildungsakademie im Palais Bückeburg - Aussenstelle Hannover - Vahrenwalder Str. 294 30179 Hannover Tel.: +49-511-3749168 Fax: +49-511-67664814 Mailto: Stefan.Wessels@ba-palais.de
* Stefan Weßels schrieb am 28.Mai.2003:
Ich lerne immer gerne dazu. Aber wurde "$?" nicht nur zum Zweck der Auswertung des Rückgabewertes implementiert ?
Nur wenn Du es was genauer brauchst. $? braucht man recht selten. Es kann aber sein, daß es nicht genügt zu wissen, ob wahr oder unwahr, also 0 oder nicht-0, sondern wenn Du wissen willst, welcher Rückgabewert genau, falls unwahr. Bernd -- Bitte die Etikette beachten: http://www.suse-etikette.de.vu/etikette.html Bitte Realnamen angeben, kein Vollquoting, kein Html, PGP oder Visitenkarten benutzen. Signatur mit "-- " abtrennen, bei Antworten "Re: " voranstellen, sonst nichts. |Zufallssignatur 4
Bernd Brodesser wrote:
* Stefan Weßels schrieb am 28.Mai.2003:
Ich lerne immer gerne dazu. Aber wurde "$?" nicht nur zum Zweck der Auswertung des Rückgabewertes implementiert ?
Nur wenn Du es was genauer brauchst. $? braucht man recht selten. Es kann aber sein, daß es nicht genügt zu wissen, ob wahr oder unwahr, also 0 oder nicht-0, sondern wenn Du wissen willst, welcher Rückgabewert genau, falls unwahr.
Danke für die Information. Ich werde es in Zukunft beherzigen. -- Mit freundlichen Grüssen Stefan Weßels Bildungsakademie im Palais Bückeburg - Aussenstelle Hannover - Vahrenwalder Str. 294 30179 Hannover Tel.: +49-511-3749168 Fax: +49-511-67664814 Mailto: Stefan.Wessels@ba-palais.de
participants (5)
-
Axel Heinrici
-
B.Brodesser@t-online.de
-
Martin Köhling
-
OS2-Fan
-
Stefan Weßels