2016-06-10 15 views
-1

Ich versuche zu testen, ob ein Skript korrekt endet oder nicht. Ich bitte den Benutzer, ja/nein einzugeben. Wenn die Antwort ja ist, wird das Skript etwas tun, wenn die Antwort nein ist, zeigt das Skript eine Fehlermeldung an. Und schließlich, wenn die Antwort etwas anderes ist, zeigt das Skript eine andere Fehlermeldung an. Wenn ich mit "Ja" antworte, muss das Skript korrekt enden. (Exit code 0) Wenn ich mit Nein antworte, muss das Skript falsch enden. (Exit Code 1) Wenn ich etwas anderes antworte, muss das Skript falsch enden. (Exit-Code 1). Mein Problem ist, wenn ich einen Beendigungscode 1 provoziere, zeigt das Skript keine Fehlermeldung an. Nachdem das Skript beendet ist, führe ich $? und ich sehe der Exit-Code 1 ist, so dass die if-else gut funktioniert, scheint aber die Funktion nichtWarum funktioniert mein Shell-Skript nicht richtig?

#!/bin/bash 
function testingexit(){ 
    if [ "$?" = "0" ] 
     then 
     echo "test ok" 
    else 
     echo "test error" 
    fi 
} 
read -p "(yes/no): " answer 
if [ "$answer" = "yes" ] || [ "$answer" = "YES" ] 
    then 
    echo "hello" 
elif [ "$answer" = "no" ] || [ "$answer" = "NO" ] 
    then 
    echo "error1" 
    exit 1 
else 
    echo "error2" 
    exit 1 
fi 


#!/bin/bash 
clear 
function menu() 
{ 
    echo "¿Hi what do you want to do?:" 
    echo 
    echo "1) opt1" 
    echo "2) opt2" 
    echo "2) opt3" 
    echo "9) Exit" 
    echo 
    echo -n "Choose an option: " 
} 
# the function use 'return' instead of 'exit' 
function get_user_input { 
read -p "Do you want to start the program?: " answer  if [[ "$answer" =~ ^yes|YES$ ]] 

     then 
     return 0 
    elif [[ "$answer" =~ ^no|NO$ ]] 
     then 
     return 1 
    else 
     return 2 
    fi 
} 

# invoke 
get_user_input 
func_return=$? 
function testingexit() { 
if [ $func_return = "0" ] 
    then 
    echo "test ok" 
else 
    echo "test error" 
fi 
} 
# default option 
opt="0" 

# loop 9 to exit 
until [ "$opt" -eq "9" ]; 
do 
    case $opt in 
     1) 
     echo "opt1" 
     menu 
     ;; 
     2) 
     echo "opt2" 
     menu 
     ;; 
     3) 
     echo "opt3" 
     menu 
     ;; 
     *) 
     menu 
     ;; 
    esac 
read opt 
done 
testingexit 
exit $func_return 

Jetzt arbeitet Ich möchte dieses Menü verwenden, wenn Ich antworte ja. Wenn ich nein antworte, sollte das Menü nicht angezeigt werden und das Skript muss die Meldung "Testfehler" anzeigen.

+4

Ich kann Ihr Problem nicht duplizieren. Außerdem definieren Sie 'testingexit', nennen es aber nicht. –

+0

Ja, ich habe das Skript nicht gut eingefügt, mein Fehler. Am Ende des Skripts habe ich die Funktion aufgerufen. –

Antwort

1

Ihr Skript würde nie aus zwei Gründen arbeiten:

  1. Sie rief nie Ihre Funktion testingexit()
  2. Auch wenn Sie es genannt wird, würde es nicht funktionieren, weil Sie nichts innerhalb der laufen kann Skript nach dem Sie 10 aufgerufen haben, da 'exit' das Skript abbricht.

Warum nicht Sie Skript wie folgt umschreiben:

#!/bin/bash 

# the function use 'return' instead of 'exit' 
function get_user_input { 
    read -p "(yes/no): " answer 
    if [[ "$answer" =~ ^yes|YES$ ]] 
     then 
     echo "hello" 
     return 0 
    elif [[ "$answer" =~ ^no|NO$ ]] 
     then 
     echo "error1" 
     return 1 
    else 
     echo "error2" 
     return 2 
    fi 
} 

# invoke 
get_user_input 
func_return=$? 

if [ $func_return = "0" ] 
    then 
    echo "test ok" 
else 
    echo "test error" 
fi 

exit $func_return 
1

Ihre Funktion testingexit nie aufgerufen wird, müssen Sie trap verwenden, um sie aufgerufen zu machen werden, wenn Ihr Programm endet:

testingexit() { 
    ... 
} 
trap testingexit EXIT 

read -rp "(yes/no): " answer 
... 

Sie können auch die if-Anweisungen in eine case-Anweisung ändern:

case "$answer" in 
    yes|YES) 
    echo "hello";; 
    no|NO) 
    echo "error1" 
    exit 1;; 
    *) 
    echo "error2" 
    exit 1;; 
esac 
Verwandte Themen