* Chris [ www.LiFEFORCE.de ] schrieb am 27.Feb.2003:
moin !
bestimmt sind hier einige, die aus dem sprichwörtlichen "ff" folgendes problem lösen können (ich hoffe dies bleibt die einzige frage, so schwer kann es ja nicht sein).
wollte mich etwas mit shell-skripten befassen. folgendes skript entstand:
Welche shell? Ich gehe mal von bash aus.
<CUT> #!/bin/sh set x=0
Einfach x=0 ohne set
while {$x<10}
Was soll das den sein? in der bash sieht das folgendermaßen aus:
while Befehl do Befehl done
$x<10 ist aber kein Befehl. Auch nach dem while gehört ein normales Linuxkommando, wie grep, rm, ls, cd und viele andere. Ok, besonders die beiden letzten sind reichlich bekloppt an dieser Stelle, grep aber ganz und gar nicht. Alle, wirklich alle, Befehle haben bei Linux einen sogenannten Exitcode, einen Rückgabewert. Dieser Rückgabewert ist entweder 0 oder eben nicht. Dabei wird der Rückgabewert 0 als richtig, alles andere als flasch interpretiert.
Wenn dieser Befehl den Rückgabewert 0 hat, dann wird das was zwichen do und done steht ausgeführt und anschließend diesen Befehl wiederholst usw. Wenn Befehl einen anderen Rückgabewert hat, dann wird ist die while-Schleife beendet und es wird nach done weitergemacht.
Wenn ich Befehl geschrieben habe, so muß es nicht ein Einzelbefehl sein, es kann eine ganze Befehlsliste sein. Also Befehle durch , bzw. RETURN, | && oder || getrennt. Siehe hierzu man bash.
Oftmals wird bei einem while, wie bei einem if, als Befehl der Befehl test genommen. test macht nichts, es hat nur einen Exitcode, auf dem es ankommt.
Was Du willst, könnte man mit
while test $x -lt 10
bewerkstelligen. Dabei vergleicht test sein erstes Argument, mit seinem dritten. (das zweite Argument ist das -lt) -lt steht für kleiner. < hingegen ist die Umlenkung der Standardeingabe und auf keinen Fall ein mathematisches Zeichen.
Du solltest Acht geben, daß $x hier nicht leer sein darf. Besser in " setzen. Denn, test hat eine ganze Menge ganz verschiedener Möglichkeiten, wenn test nur zwei Argumente hat, verhält es sich anders und bei -lt als dann erstes Argument, bekommst Du eien Fehlermeldung.
Siehe hierzu man test. Man könnte test auch mit [ ... ] ersetzen, dies ist aber nur ein anderer Name für test, und keine Syntax. Deshalb bevorzuge ich test, um nicht was vorzutäuschen, was nicht ist.
{
Keine Klammer, nach einem while kommt ein do ... done und keine Klammern.
puts "x is $x"
Was um alles in der Welt soll puts sein? und was is? bash ist kein C.
#incr x
das ist auskommentiert. # ist das Kommentarzeichen.
# clear # ifconfig #sleep 1 }
</CUT>
chmod +x ist gesetzt. es liefert ein: : line 11: syntax error: unexpected end of file
WARUM?
Weil das, was Du geschrieben hast, nichts mit bash zu tun hat.
Übrigens, alles was Du in einem skript schreibst, funktioniert genausogut auf der Tastatur. Du kanst auch while test 2 -lt 10 hinter dem Promt eingeben. Dann bekomst Du ein > als prompt und da kanst Du dann ein do eingeben usw. Bei dem abschließenden done wird dann alles ausgeführt.
Du solltest Dich ausführlich mit der shell befassen.
Bernd