Wie Script aus if-then-else beenden ?

Hallo,

ich mache in einem Script ein paar Checks nach gefüllten Variablen etc.

dabei gibt es auch

if [$# -ne 1] ; then
usage
fi

So, wenn ich jetzt hinter usage noch ; exit schreibe, dann fliege ich aus dem Programm, was ich ja im Grunde auch will.

aber ich fliege auch aus meiner Shell und das will ich nict.

Wie sage ich dem Script „wenn Zustand nicht eintrifft, dann beende dich einfach“ ?

Grüße

Chris

Hallo Chris,

ich mache in einem Script ein paar Checks nach gefüllten
Variablen etc.
dabei gibt es auch

if [$# -ne 1] ; then
usage
fi

So, wenn ich jetzt hinter usage noch ; exit schreibe, dann
fliege ich aus dem Programm, was ich ja im Grunde auch will.

aber ich fliege auch aus meiner Shell und das will ich nict.

Ja, was willst Du denn dann…? :wink:
Ich verstehe das Problem nicht ganz, so etwas in der Art ist doch normal:

#!/bin/bash
usage() {
 echo "USAGE: $0 Parameter"
 exit 1
}

if [$# -eq 0]; then
 usage
else
 echo "Alles richtig gemacht mit $1" 
fi
exit 0

Auf Variable, die innerhalb des Skriptes definiert wurden, hast Du dann natürlich auch keinen Zugriff mehr (war das der Hintergrund deiner Anfrage?), aber die brauchst Du ja auch nicht mehr. Du landest ja nach dem exit nicht im luftleeren Raum, sondern bist eben in deiner normalen Shell, von der aus Du dein Skript aufgerufen hast.
Bitte versuche mal genauer zu erklären, wo dich der Schuh drückt. Ich bin im Moment nicht im Stande, das Problem zu erkennen.

Viele Grüße
Marvin

aber ich fliege auch aus meiner Shell und das will ich nict.

Das ist halt so bei exit. Damit wird die Shell beendet. Also sollte dein Programm eine eigene Shell aufrufen.

In der ersten Zeile deines Scripts muss daher die Shell mit

#!/bin/bash

aufgerufen werden (oder statt bash halt die Shell, die du vorziehst).

Gruß,
Stefan

Hallo Stefan,

In der ersten Zeile deines Scripts muss daher die Shell mit

#!/bin/bash

aufgerufen werden

Okay, also ich melde mich an, welchsel in die bash.

im Script steht in der ersten Zeile
#!/bin/ksh

rufe ich das Script ohne Parameter auf, zieht

if [$# -ne 1] ; then
usage ;exit 0
fi

und ich finde mich im Home-Verzeichnis wieder und in der ksh.

Wo ist mein Fehler dabei ?

Grüße

Chris

Die Lösung:
Hallo,

die Lösung ist, ich habe das Script erstellt und dann mit . ./Scriptname aufgerufen. In dem Fall schmeißt mich das exit ganz raus.

Gebe ich dem Script x-Rechte, dann beendet ein "exit " innerhalb des Scripts nur das Script selbst.

Da muß man auch erst mal drauf kommen…

Danke und Grüße

Chris

Nachfrage
Hallo Chris,

die Lösung ist, ich habe das Script erstellt und dann mit .
./Scriptname aufgerufen. In dem Fall schmeißt mich das exit
ganz raus.

Du machst mich neugierig. Wie schaffst Du es, ein nichtausführbares Skript (ohne x) zu starten?
Ich habe zur Probe ein Miniskript geschrieben, es heisst hallo:

#!/bin/bash
echo "Hallo Welt"
exit

das jetzt ohne x:

kb@etch:~/bin$ ls -l hallo
-rw-r--r-- 1 kb kb 35 2008-05-15 13:13 hallo

jetzt versuche ich das auszuführen:

kb@etch:~/bin$ ./hallo
bash: ./hallo: Keine Berechtigung

wie eigentlich nicht anders zu erwarten. Deshalb aus Interesse, mit welchem Trick schaffst Du es, das Skript ohne x-Bit zu starten, liegt es an deiner Kornshell (wenn ich mich recht erinnere)?

Gebe ich dem Script x-Rechte, dann beendet ein "exit "
innerhalb des Scripts nur das Script selbst.
Da muß man auch erst mal drauf kommen…

…daß Du einem Skript keine x-Rechte gibst :wink:
Ich bin wirklich verblüfft.

Viele Grüße
Marvin

Du machst mich neugierig. Wie schaffst Du es, ein
nichtausführbares Skript (ohne x) zu starten?

Mit . ./bla.sh. In einem Wort: Punktleerpunktslashblapunktsh.

Der erste Punkt ist das Geheimnis.

Gruß,
Stefan

Hallo Stefan,

Du machst mich neugierig. Wie schaffst Du es, ein
nichtausführbares Skript (ohne x) zu starten?

Mit . ./bla.sh. In einem Wort: Punktleerpunktslashblapunktsh.

Der erste Punkt ist das Geheimnis.

Ja danke. Das „funktioniert“, wenn man es so nennen kann. Aber ich überlege gerade, ob es dafür einen sinnvollen Einsatz gibt, außer dem, daß ich jetzt begreife (und auch sehe), was Du für Probleme hattest. Damit verlierst Du ja wirklich alles. Das erinnert mich an finstere DOS-Zeiten, als auch immer irgendwas nur aufblitzte und man es nur sehen konnte, wenn künstlich eine Eingabe an’s Ende vom Skript gehängt wurde.
Ehrlich gesagt, wäre ich nie auf die Idee gekommen, daß jemand ein Skript ohne x-Bit startet. Ich würde dir schon empfehlen, immer mit chmod +x das Skript ausführbar zu machen, das erspart dir so manches Problem.

Viele Grüße
Marvin

Hallo Stefan,

Hi Klaus,

Der erste Punkt ist das Geheimnis.

Ja danke. Das „funktioniert“, wenn man es so nennen kann. Aber
ich überlege gerade, ob es dafür einen sinnvollen Einsatz
gibt, außer dem, daß ich jetzt begreife (und auch sehe), was
Du für Probleme hattest.

Der . ist ein Kuerzel fuer source und entspricht etwa dem, was andere Programmiersprachen unter #include kennen: der Inhalt der Datei wird in die aktuelle shell eingebunden. Das ist ganz praktisch, wenn man dort einen Haufen Variablen-, Funktions- oder alias-Definitionen drin hat. Alles darin wird in der aktuellen shell ausgefuehrt (natuerlich auch ein exit).

Startet man ein shell script mit execute permission direkt wird zuerst eine neue shell gestartet und anschliessend der Inhalt des scripts in dieser subshell ausgefuehrt. Ein exit beendet diese dann auch, aber natuerlich nicht die uebergeordnete (meist interaktive) shell.

Damit verlierst Du ja wirklich alles.

Ja. Das ist auch richtig so. Es ist wie mit den meisten Dingen: man muss halt doch irgendwie wissen, was man tut.

Gruss vom Frank.

Hallo Frank,

Der . ist ein Kuerzel fuer source und entspricht etwa dem, was
andere Programmiersprachen unter #include kennen: der Inhalt
der Datei wird in die aktuelle shell eingebunden. Das ist
ganz praktisch, wenn man dort einen Haufen Variablen-,
Funktions- oder alias-Definitionen drin hat. Alles darin wird
in der aktuellen shell ausgefuehrt (natuerlich auch ein exit).

Danke für die gute Erklärung. Vielleicht kann man’s ja doch manchmal gebrauchen, aber für gewöhnliche Skripte bringt es mir offenbar mehr Probleme als es löst.

Startet man ein shell script mit execute permission direkt
wird zuerst eine neue shell gestartet und anschliessend der
Inhalt des scripts in dieser subshell ausgefuehrt. Ein exit
beendet diese dann auch, aber natuerlich nicht die
uebergeordnete (meist interaktive) shell.

Genau davon bin ich ausgegangen und habe deshalb überhaupt nicht verstanden, wieso exit da Schwierigkeiten machen sollte.

Viele Grüße
Marvin

Ehrlich gesagt, wäre ich nie auf die Idee gekommen, daß jemand
ein Skript ohne x-Bit startet.

Ich auch nicht.

Ich würde dir schon empfehlen,
immer mit chmod +x das Skript ausführbar zu machen, das
erspart dir so manches Problem.

Ich machs schon immer so, aber vielen Dank für den obligatorischen Hinweis :wink:

Gruß,
Stefan