Ich lerne, wie ich verschiedene set
Optionen in meinem Skript effizient nutzen kann , und bin darauf gestoßen, set -u
dass dies perfekt zum Beenden meines Skripts ist, wenn eine Variable nicht richtig festgelegt wird (z. B. Löschen von Benutzern). Nach dem Mann Seite, set -u
und set -e
hat die folgende ...
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
Ich habe ein Testskript erstellt, um diese Funktionalität zu testen, aber es scheint nicht wie erwartet zu funktionieren. Vielleicht könnte mir jemand mein Problem besser erklären und wo ich falsch interpretiere? Testskript ist unten. Vielen Dank.
set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}
Ich erwarte, dass das Skript 0 und "Dies funktioniert" anzeigt und dann fehlschlägt, da ${testing2}
es nicht festgelegt ist.
Stattdessen wird 0 und "Dies funktioniert" angezeigt , gefolgt von 0 und dann 0 Dies sollte nicht angezeigt werden
Kann jemand etwas Wissen vermitteln? Vielen Dank.
quelle
Antworten:
Aus "man Bash":
Wenn Sie dies tun, setzen
testing2=
Sie die Variable auf die Nullzeichenfolge.Ändern Sie das in
unset testing2
und versuchen Sie es erneut.Das
set -e
hilft nicht , in diesem Fall als eine Zuordnung nie einen Exit - Code von 1. Versuchen Sie dieses zu sehen ist , dass der letzte Befehl ausgeführt (die Zuweisung) hat einen Exit - Code von 0 oder diese Frage lesen :Und ich glaube auch, dass die Verwendung von set -e eher ein Problem als eine Lösung ist.
Bei der Verwendung nicht festgelegter Variablen kann ein Fehler auftreten
set -u
:Wird ausgegeben:
quelle
testing2=
setzt dietesting2
Variable auf eine leere Zeichenfolge; Die Variable ist tatsächlich gesetzt .Wenn Sie jedoch
echo $testing99
in einer interaktiven Bash-Shell (ohne Einstellungerrexit
, dhset -e
) ausgeführt werden, wird folgende Fehlermeldung angezeigt:Beiseite
Beim Testen von Skripten habe ich festgestellt, dass eine interaktive Shell nicht immer beendet wird, wenn versucht wird, eine Variable zu erweitern, die nicht festgelegt wurde, während eine nicht interaktive Shell (die ein Shell-Skript ausführt) immer beendet wird . Laut der POSIX-Manpage für
set
:Eine interaktive Bash-Shell wird erst beendet, wenn
errexit
sie ebenfalls festgelegt wurde. Auf der anderen Seite wird eine interaktive Dash-Shell nicht beendet - selbst wennset -e
sie zuvor ausgeführt wurde.quelle