Batch/Shell Programmierung
-
Ich möchte ein Shellskript erstellen sowas wie .bat/.cmd
Ich habe schon einiges realisiert wie das ausführen von Befehlen, so aber jetzt möchte ich springen im Skript realisieren sowie goto bei Batch.
Beispiel aus Batch
springen: Beispiel: @echo off :Start echo bin in der Schleife goto Start mit goto springt die Batchverarbeitung an jede beliebige Stelle der Datei!
Alle Inhalte werden normalerweise an meine Shell.exe %1 gesendet, wenn ich das wie bei Batch mache und nach dem Zeichen : suche, setze ich diesen als Startpunkt aber wie gehe ich weiter vor??
Bitte um Tipps
-
Habe ich das richtig verstanden - du willst .BAT Dateien von Hand auswerten und abarbeiten?
Da ist es zunächst mal eine gute Idee, die Datei komplett einzulesen und z.B. in einem vector<string> zeilenweise zu speichern. Die Sprungmarken erkennst du ganz klar am Doppelpunkt (und wenn du es brauchst, kannst du sie per find() auch wiederfinden), die zugehörigen Sprungbefehle am "goto" oder "if ... goto".
Das heißt, du mußt nur die aktuelle Zeile überprüfen, ob sie ein "goto" enthält. Wenn ja, liest du den Namen der Sprungmarke aus und suchst sie per find().
-
Danke erstmal für den Tipp
Bisher wurden in meiner Shell die Befehle zeielnweise eingelesen und gleich ausgeführt:
string str, file = argv[1]; ifstream ifs(file.c_str()); while(!ifs.eof()) { getline(ifs,str); x = main_start(str); if(x == EXIT) return 0; }
Jede Zeile ist ein Befehl welche dann ausgeführt wird, dass mit dem Startpunkt will ich auch mit : machen also :Start
Ist es mit meiner Funktion auch möglich gotos zu erstellen, ich dachte mir wenn als erstes Zeichen ein : vorkommt wird dieser zwischengespeichert und weitergemacht bis zum goto, welche irgendwie zu der Position zurückspringen soll .
-
Ja, möglich wäre es sicher - wenn du eine Sprungmarke siehst, trägst du sie zusammen mit der aktuellen Datei-Position (die bekommst du mit tellg()) in eine map<> ein, bei einem goto suchst du dir den passenden map-Eintrag und springst mit seekg() an die gemerkte Stelle.
Einziges Problem könnten Sprünge nach "unten" sein - da kennst du die Zielposition noch nicht, wenn du beim goto angekommen bist. Die primitve Lösung wäre es, die Datei so weit einzulesen (und abgesehen von zwischendurch auftauchenden Sprungmarken zu ignorieren), bis du den Zielpunkt gefunden hast oder am Dateiende stehst.
-
Es erweist sich, dass selbst die Implementierung von gotos eigenartig schwierig werden kann.
Wäre es nicht besser, deiner Shell eine strukturierte Schleifenkonstruktion (a la for in der bash) zu spendieren?
Wie auch immer. Vielleicht wäre es eleganter, die Eingabedatei nach Sprungzielen zu durchsuchen, bevor sie ausgeführt wird (Stichwort: tokenizing) und dann aufbereitet in einen Puffer zu legen. Das könnte Dir btw yacc oder Bison abnehmen.