2016-06-20 26 views
1

Ich habe das folgende Unix-Shell-Skript, in dem ich zwei ganzzahlige Variablen nämlich a und b haben.Unix-Shell-Skript: Beenden mit Rückgabewert

Wenn a größer als oder gleich b ist, sollte das Shell-Skript mit 0 beenden.

Sonst sollte es mit Rückkehr 1 verlassen.

Mein Versuch:

Script: ConditionTest.sh

#!/bin/sh 

a=10 
b=20 

if [ $a -ge $b ] 
then 
     exit 0 
else 
     exit 1 
fi 
    .... 
    .... 
    .... 

Kursivschrift:

$ ./ConditionTest.sh 
$ 

Hinweis: Ich bin kein Rückgabewert immer nach der Ausführung die Datei.

+1

Der Ausgangswert wird in '$?' Gespeichert. Führen Sie 'echo $?' Nach dem Ausführen des Skripts aus. Wenn Sie den Wert als Teil der Skriptausgabe sehen wollen, dann drucken Sie ihn: 'echo 0; exit 0' und 'echo 1; Ausgang 1'. –

+1

"irgendeinen Rückgabewert erhalten" bedeutet "kein gedruckter Wert" für Sie? – Jdamian

Antwort

3

Die Shell gibt den Exit-Status des letzten Befehls in der Variablen ? an. Sie konnten es einfach überprüfen:

mycommand 
echo $? 

... oder man könnte es etwas anderes zu tun verwenden je nach ihrem Wert:

mycommand && echo "ok" || echo "failed" 

oder alternativ und leicht lesbarer:

if mycommand; then 
    # exit with 0 
    echo "ok" 
else 
    # exit with non-zero 
    echo "failed" 
if 
+1

Ich bin wählerisch, '$?' Expandiert auf den Wert, nicht die Variable. Die Variable heißt '?'. – cdarke

+0

@cdarke Richtig du bist! Ich werde meine Antwort ändern. – Kusalananda

3

Ihr Skript sieht gut aus; Du hast alles richtig gemacht.

#!/bin/sh 

a=10 
b=20 

if [ $a -ge $b ] 
then 
     exit 0 
else 
     exit 1 
fi 

Also hier ist, wo wir es und überprüfen Sie den Rückgabewert aus:

$ sh test.sh 
$ echo $? 
1 
$ 

10 ist nicht größer als oder gleich 20

Ein anderer Weg, um es zu testen so sein würde:

$ sh test.sh && echo "succeeded" || echo "failed" 
failed 

Wie in den Kommentaren erwähnt, sollten Sie auch Ihre Variablen zitieren, immer:

if [ $a -ge $b ] 

Sollte sein:

if [ "$a" -ge "$b" ] 
+1

Kleinere Verbesserung: Verwenden Sie IMMER doppelte Variablen um Variablen. '' "$ a" -ge "$ b" ''. Otherwide erhalten Sie mittlere Syntaxfehler, die im Code schwer zu erkennen sind, wenn eine Variable leer ist. – allo

+0

In einer Bearbeitung notiert (und einverstanden; ich mache das immer). Ich hatte ursprünglich den OP-Code einfach kopiert und eingefügt. – Will

0

zu den vorherigen Antworten hinzuzufügen, die Schlüsselidee Sie ist verstehen sollte, dass jedes Programm eine Reihe liefert beim Verlassen. Diese Nummer wird verwendet, um zu melden, ob der Befehl seine Operation erfolgreich abgeschlossen hat, und wenn nicht, um welchen Fehlertyp es sich handelt.

Wie erwähnt, kann auf den Exit-Code des zuletzt ausgeführten Befehls mit $? zugegriffen werden.

Der Grund, warum nichts von Ihrem Skript gedruckt wurde, ist, dass Ihr Skript 1 zurückgegeben hat, aber der Exit-Code eines Befehls nicht gedruckt wird.(Dies entspricht dem Aufruf einer Funktion. Sie erhalten einen Rückgabewert von der Funktion, der aber nicht gedruckt wird.)