
Dies ist ein Auszug meines Codes:
ninja ()
{
if $1 = toto
then
return 1
elif $1 = tata
then
return 4
fi
}
main () {
ninja "tata"
if [ $? -ne 1 ]
then
somecode
fi
}
main "$@"
Wenn meine Funktion etwas zurückgibt, wird das Programm ohne Grund einfach beendet (ich habe es mit einem Trap EXIT getestet), die Funktion gibt 4 zurück und führt den Trap aus.
Bearbeiten: funktioniert, wenn ich kommentiere
set -o errexit
set -o errtrace
Aber wie kann ich den Fehler finden?
Antwort1
Wenn Sie testen möchten, ob das Funktionsargument einem String entspricht, müssen Sie „construct“ verwenden. if [ "$x" == "string" ]
Ihr Code sieht dann folgendermaßen aus:
test () {
if [ "$1" == "toto" ] then
return 1
elif [ "$1" == "tata" ] then
return 4
fi
}
main () {
test "tata"
if [ $? -ne 1 ] then
echo "somecode"
fi
}
main "$@"
Und Sie könnten test
den Namen für die Funktion verwenden. Wenn Sie „builtin“ aufrufen möchten test
, verwenden Sie builtin test
„construct“.
Und achten Sie auf =
(Zuweisung) und ==
(Vergleich). Innerhalb des Tests funktioniert der [
Operator wie und prüft die Gleichheit der Zeichenfolgen (nicht der Zahlen).]
=
==
set -o errexit
wird sofort beendet, nachdem der Befehl einen Wert ungleich Null (nicht erfolgreich) zurückgibt. Sie ninja
geben einen 1
Wert ungleich Null zurück und beenden das Programm.
Ihr Code funktioniert ohne Tests nicht, da if
die Anweisung versucht, darin Anweisungen auszuführen und den Beendigungsstatus des Befehls zu bestimmen: Wenn der Beendigungsstatus Null (Erfolg) ist, führen Sie die Anweisungen nach then
bis elif
aus fi
.