* Michael Hoeller schrieb am 27.Apr.2003:
ich möchte gerne die übergebenen Parameter $1 $2 $2. Wenn einer oder mehrere Argumente den 'Wert' ? habe soll das jeweilige Argument gleich Null gesetzt werden. Ich habe das wie untern angefügt versucht. Da ist aber leider ein Fehler drin. Wie prüfe ich $1 auf den Inhlat '?' ???
Für jedes Argument ausfüfren: if [$1 = '?']
Auch wenn es so aussieht, aber das [ ist kein Teil der Syntax, sondern ein Befehl. Genauer es ist ein Synonym von test. Einziger Unterschied, [ will zwingend als letztes Argument ein ]. Alles relativ sinnfrei, wenn man mal davon absieht, daß dadurch eine Syntax gefaikt wird. Aber [ ist wie gesagt kein Teil der Syntax, daher muß [ wie jeder Befehl durch ein space getrennt sein und das abschließende ] auch, da es sonst kein eigenes Argument wäre. Richtig ist somit: if [ $1 = '?' ] oder imho besser if test $1 = '?' besser deshalb, weil hier keine Syntax gefaikt wird, sondern sofort zu erkennen ist, daß test ein normaler Befehl ist. Da könnte bei Bedarf auch ein anderer stehen, etwa grep. Der Befehl, bzw, die Befehle, die nach if und vor then stehen, werden normal ausgeführt. Wenn es einen Exitcode 0 gibt, so wird anschließend der then-Teil ausgeführt, wenn es einen Exitcode != 0 gibt, so wird der else-Teil ausgeführt, falls vorhanden. test bzw. [ ist ein Befehl, der keine Ausgabe hat, nur Fehlerausgabe im Fehlerfalle und auch niergends was verändert, es gibt nur ein Exitcode aus. Im obigen Falle, eine 0 falls beide Argumente links und rechts vom = gleich sind und eine 1 sonst. Bei einem Syntaxfehler gibt es eine Fehlermeldung und den Exitcode 2 Und hier kann es noch zu einem kleinen Problem kommen: Wenn es kein erstes Argument gibt, dann ersetzt die shell das $1 mit nichts, und es steht da if [ = ? ] bzw. if test = ? und das ist ein Syntaxfehler. Bitte bedenke, daß die Shell die Ersetzungen macht. Es ist die Shell, die das $1 durch das erste Argument ersetzt, der Befehl, hier test bekommt davon nichts mit. test ist zwar ein, in der Shell eingebauter Befehl, aber das ist genauso als wäre es ein externer. Darum ist folgendes besser: if [ "$1" = '?' ] bzw. if test "$1" = '?' Falls es jetzt kein erstes Argument $1 gibt, wird test ein leeres Argument übergeben, und alles ist gut. Zum Abschluß zu Deiner obigen Zeile noch etwas, was Du richtig gemacht hast, nämlich das ? in '..' zu setzen. Hättest Du das nicht gemacht, so funktionierte Dein Skript so lange, als daß Du keine Datei mit nur einem Buchstaben oder Zeichen, außer . in Deinem aktuellen Verzeichnis hättest. Hättest Du nämlich eine oder mehere Dateien, deren Namen nur aus einem Zeichen bestände, in Deinem aktuellen Verzeichnis und das ? stände ohne '..' in Deinem Skript, so ersetzte die shell das ? durch die Namen dieser Dateien. Es ist somit wichtig das ? in '..' zu setzen. Das Fatale, solange es kein so kurzen Dateinamen im aktuellen Verzeichnis gibt, funktioniert alles prima. Erst wenn mal so ein Dateiname auftaucht gibt es Probleme und man weiß nicht woher, da man das Skript ja längst getestet und abgehakt hat. Vielleicht wurde es auch von einem anderen Skript aufgerufen, dann wird es meist erst richtig schwierig.
then set $1 = 0;
Das geht so nicht. Eine normale Variable, etwa $foo wird gesetzt ohne dem $. Also foo=bar echo $foo Die Variable heißt somit auch nicht $foo, sondern foo. Die Shellsyntax ist so, daß sie ein $ gefolgt von einem Variablenname durch den Inhalt der Variable ersetzt, jedenfalls solange es nicht innerhalb von '..' steht oder das $ durch ein \ geschützt ist. Eine andere Möglichkeit ist ${foo} Somit ist es flashc die Positionsvariable $1 zu nennen, sie heißt eigentlich 1. Aber 1=0 ist wohl vollends daneben. Nein, Positionsvariable kann man so nicht setzen. Die Methode, mit der man Positionsvariablen setzt, hast Du schon angedeutet, nämlich mit set. Allerdings nicht so. Mit set kann man nur alle Positionsvariable auf einmal setzen. Und die alten Werte sind verloren, alle. Wenn Du mit set die erste Positionsvariablen setzen wolltest, so müßte es wie folgt geschehen: set 0 $2 $3 $4 $5 hoffend, daß da nie mehr als fünf Positionsvariablen auftauchen. Letztere wären nämlich verloren. Du könntest selbstverständlich sieben oder acht Positionsvariable nehmen, aber das ändert nichts wirklich. $* oder $@ nehmen geht leider auch nicht, da da ja auch die erste Positonsvariable dabei ist. (Es wäre nur "$@" richtig, aber auch hier ist die erste Positionsvariable dabei und somit nicht zu gebrauchen) Insgesammt besser ist es somit, wenn Du am Anfang des Skripts den Positionsvariable normale Variable zuordnest. Etwa: foo=$1 bar=$2 foobar=$3 baz=$4 Natürlich nicht mit foo und bar, sondern mit sprechenden Namen für die Bedeutung des jeweiligen Argument. Diese Variablen kannst Du dann überprüfen und beliebig andere Werte zuordnen.
fi
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