Eingabe und Ausgabe

Das kleine Beispielprogramm enthielt schon zwei wichtige Komponenten von Anwendungen: Ein- und Ausgabe. Den Input-Befehl am Ende haben wir nur eingebaut, damit sich das Programmfenster nicht direkt wieder schließt: Input() liest Ihre Eingabe von der Tastatur, und diese ist erst abgeschlossen, wenn Sie [Eingabe] drücken. Was Sie eingetippt haben, landet in der Stringvariable a$, die das kleine Beispielprogramm aber nicht mehr auswertet. Wenn Sie eine ausführbare Datei erstellen, benötigen Sie den abschließenden Input-Befehl nicht.

Sinnvoller wird Input verwendet, um ein Programm interaktiv zu machen: Es kann dem Anwender damit Fragen stellen und die eingelesenen Daten auswerten und weiter verarbeiten. PrintN ist eine Variante des klassischen BASIC-Befehls Print (den es in PureBasic auch gibt): Während Print den übergebenen Text auf die Konsole schreibt, hängt PrintN noch einen Zeilenumbruch an.

Projekt: Mini-Shell

PureBasic bringt etliche eingebaute Funktionen mit, über die Sie z. B. auf Dateien zugreifen und andere Programme starten können. Im Rahmen dieses einführenden Artikels können wir nur eine kleine Auswahl der Sprach-Features vorstellen (und damit hoffentlich Lust auf mehr machen), wir beschränken uns hier auf die Befehle, die Sie brauchen, um eine kleine Shell (wie die Bash) zu entwickeln. Shells arbeiten im Wesentlichen wie folgt:

  • In einer Endlosschleife zeigen sie einen Shell-Prompt an, in der Bash sehen Sie z. B. immer Benutzer- und Rechnername, das aktuelle Verzeichnis und ein Dollar- ($) oder Raute-Zeichen (#) – dahinter geben Sie einen Befehl ein.
  • Die Shell muss dann einen neuen Prozess erzeugen, in dem das gewünschte Programm startet. Außerdem wartet sie, bis das neue Programm beendet wurde.
  • Danach springt die Shell an den Anfang der Endlosschleife zurück, und es erscheint wieder der Shell-Prompt.

In PureBasic gibt es für Endlosschleifen die Befehle Repeat (wiederhole) und ForEver (ewig): Alles, was Sie zwischen diese beiden Befehle packen, wird dauerhaft wiederholt. Um aus einer solchen Schleife "ausbrechen" zu können, steht der Befehl Break zur Verfügung. Die Mini-Shell soll sich bei Eingabe von exit beenden (wie es auch die Bash tut); dafür benötigen wir eine Fallunterscheidung.

PureBasic unterstützt die klassische If-Then-Else-Konstruktion (siehe Artikel Print "Hallo Welt" ab Seite 38) mit folgender Syntax:

If Bedingung
  ; Befehle
Else
  ; Befehle
EndIf

Den Else-Teil kann man auch weg lassen und hinter den Befehlen direkt EndIf schreiben. Das Semikolon ist in PureBasic das Zeichen, das Kommentare einleitet. Ein erster Ansatz für das Shell-Programm sieht damit wie folgt aus:

Repeat
  Print ("EasyShell: ")
  eingabe$ = Input()
  If eingabe$ = "exit"
    Break  ; Ende
  EndIf
  ; Programm ausführen
ForEver

Wenn Sie diesen Code eingeben und vor der ersten Zeile noch den für Terminalanwendungen zwingenden Befehl OpenConsole() ergänzen, können Sie das Programm bereits übersetzen und starten – es liest so lange neue Befehle ein, bis Sie exit eingeben.

Was noch fehlt, ist der Start der Programme. Dafür stellt PureBasic das Kommando RunProgram zur Verfügung. Sie könnten einfach den Befehl RunProgram (eingabe$) ergänzen, allerdings würde die Mini-Shell dann nicht auf das Ende der Programmausführung warten. RunProgram ist eine Funktion, die auch einen Rückgabewert hat: Den können Sie sich merken und in anderen PureBasic-Funktionen verwenden. Die korrekte Lösung für den Programmstart sieht folgendermaßen aus:

p = RunProgram (eingabe$, "", "", #PB_Program_Open)
WaitProgram (p)
CloseProgram (p)

Der Aufruf von RunProgram ist hier etwas komplexer – wenn Sie in der PureBasic-Dokumentation nachschlagen, finden Sie heraus, dass Sie beim Programmstart die Option #PB_Program_Open verwenden müssen: Die sorgt dafür, dass die Mini-Shell das gestartete Programm beobachten kann. Um auf das Ende des Programms zu warten, benutzen Sie dann den Befehl WaitProgram(p) – er braucht p als Argument, denn Sie können mit RunProgram beliebig viele Programme starten und müssen WaitProgram mitteilen, auf welches davon Sie warten möchten. Schließlich müssen Sie noch CloseProgram(p) aufrufen, um der Shell zu sagen, dass Sie das beendete Programm nicht weiter beobachten wollen.

Bauen Sie diese drei Befehle anstelle des Kommentars (; Programm ausführen) in das Programm ein, dann funktioniert es schon: Sie können die Mini-Shell mit [F5] kompilieren und starten und dann in Ihrem Shell-Programm z. B. ls oder ps eingeben. Ein Problem entsteht, wenn Sie ein falsches Kommando eingeben: Dann ist der Aufruf RunProgram (eingabe$, ...) nicht erfolgreich, und WaitProgram(p) führt zu einer Fehlermeldung, weil p nicht für ein gestartetes Programm steht (sondern den Fehlercode 0 enthält). Das Problem können Sie vermeiden, indem Sie mit IsProgram(p) testen, ob der Aufruf von RunProgram erfolgreich war:

p = RunProgram (eingabe$, "", "", #PB_Program_Open)
If IsProgram (p)
  WaitProgram (p)
  CloseProgram (p)
EndIf

Eine weitere Fehlfunktion Ihrer Mini-Shell entdecken Sie, wenn Sie in der Shell gar nichts eingeben und nur [Eingabe] drücken – dann schlägt schon der Aufruf von RunProgram fehl und verursacht einen Abbruch. Also müssen Sie noch den Fall einer leeren Eingabe abfangen. Dazu können Sie den PureBasic-Befehl Continue verwenden: Der führt in allen Schleifen dazu, dass die restlichen Befehle innerhalb der Schleife übersprungen werden und es direkt mit dem nächsten Schleifendurchlauf weitergeht. Wie das funktioniert, sehen Sie am leichtesten am folgenden Beispiel, das eine klassische BASIC-Zählschleife mit den Schlüsselwörtern For und Next verwendet: Sie zählt eine Variable von 1 bis 8 hoch und führt für jede der Zahlen die Befehle zwischen For und Next aus:

For i = 1 To 8
  If i = 5
    Continue
  EndIf
  Print (Str(i) + ",")
Next

Ohne die Fallunterscheidung würde dieser Code 1,2,3,4,5,6,7,8, ausgeben. Mit den zusätzlichen Befehlen prüft das Programm, ob i den Wert 5 hat: Wenn ja, dann sorgt Continue dafür, dass die restlichen Befehle in diesem Durchlauf übersprungen werden – also auch der Print-Befehl. Dadurch ist das Endergebnis 1,2,3,4,6,7,8, (ohne die "5").

Hätten Sie in diesem Beispiel statt Continue den Befehl Break verwendet, wäre die Ausgabe noch kürzer gewesen (nur 1,2,3,4,) – Continue ändert also nur das Verhalten eines Schleifendurchlaufs, während Break eine Schleife komplett abbricht.

Für die Mini-Shell brauchen Sie nach der Eingabe mit Input darum folgenden Code-Block:

If eingabe$ = ""
  Continue
EndIf

Wenn Sie das alles zusammen bauen, entsteht Code, der zunächst prüft, ob die Eingabe leer ist. Dann prüft er, ob die Eingabe exit ist. Wenn auch das nicht der Fall ist, wird der jeweilige Befehl ausgeführt. Das kann man in PureBasic schöner machen, denn es gibt die Befehle Select (Auswahl) und Case, mit denen sich verschiedene Fälle behandeln lassen.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • GUI-Programmierung leicht gemacht mit Basic
    Um ansprechende Programme zu entwickeln, braucht es keinen Vollprofi, der Programmiersprachen mit der Muttermilch aufgesogen hat: Mit einem Basic-Dialekt kommt im Prinzip jeder schnell zu einem ordentlichen Ergebnis.
  • Programmiersprachen unter Linux
    Linux ist ein wahres Paradies für Programmierer, denn nahezu jede aktuelle oder in der Vergangenheit verwendete Programmiersprache gibt es auch für das freie Betriebssystem. Im Auftakt zu unserer neuen Serie über Programmiersprachen schauen wir auf einen echten Klassiker: BASIC.
  • Programmieren für Einsteiger
    Programmierer haben Linux und die zahlreichen Linux-Anwendungen entwickelt. Auch für Neulinge auf diesem Gebiet bietet Linux zahlreiche Optionen – wie Sie hier einen Einstieg finden können, verraten die Artikel unserer aktuellen Titelstrecke.
  • Klassiker aus den 80ern wiederbeleben
    Die Vorgänger der PCs waren die Homecomputer: Mit 8-Bit-Prozessoren und um die 64 KByte Arbeitsspeicher waren sie nicht besonders leistungsfähig – sie hatten aber einen BASIC-Interpreter eingebaut, was viele frühe Computerbesitzer zum Programmieren brachte.
  • Gambas
    Schon lange fehlt ein Visual-Basic-ähnliches Programmiersystem für Linux. Gambas ist auf dem besten Wege, diese Lücke zu schließen.
Kommentare

Infos zur Publikation

title_2014_03

Digitale Ausgabe: Preis € 9,80
(inkl. 19% MwSt.)

EasyLinux erscheint vierteljährlich und kostet EUR 9,80. Weitere Informationen zum Heft finden Sie auf der EasyLinux-Homepage.

Das EasyLinux-Jahresabo mit Prämie kostet ab EUR 33,30. Details zum EasyLinux-Jahresabo finden Sie im Medialinx-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!      

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 0 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...
o2 surfstick software für ubuntu?
daniel soltek, 15.07.2014 18:27, 1 Antworten
hallo zusammen, habe mir einen o2 surfstick huawei bestellt und gerade festgestellt, das der nic...
Öhm - wozu Benutzername, wenn man dann hier mit Klarnamen angezeigt wird?
Thomas Kallay, 03.07.2014 20:30, 1 Antworten
Hallo Team von Linux-Community, kleine Zwischenfrage: warum muß man beim Registrieren einen Us...
openSUSE 13.1 - Login-Problem wg. Fehler im Intel-Grafiktreiber?
Thomas Kallay, 03.07.2014 20:26, 8 Antworten
Hallo Linux-Community, habe hier ein sogenanntes Hybrid-Notebook laufen, mit einer Intel-HD460...
Fernwartung für Linux?
Alfred Böllmann, 20.06.2014 15:30, 7 Antworten
Hi liebe Linux-Freunde, bin beim klassischen Probleme googeln auf www.expertiger.de gestoßen, ei...