Ich habe eine Funktion, die 1 zurückgibt, wenn die Nummer eine gültige zehnstellige Nummer ist:
valNum()
{
flag=1
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo "Invalid Number"
flag=0
fi
return $flag
}
Es wird aufgerufen von:
if [[ $(valNum $num) -eq 1 ]]; then
#do something
fi
Die Funktion funktioniert einwandfrei, wenn die Nummer gültig ist, zeigt jedoch einen Syntaxfehler an, wenn eine ungültige Nummer eingegeben wird.
quelle
if valnum "$num"
es äquivalent ist,if valnum "$num" = 0
dh "wenn es wahr ist". Die Faustregel bei sh-Skripten lautet: 0 = wahr / Erfolg, ungleich Null = falsch / Fehler.if [[ $(valNum $num) -eq 1 ]]
Sie können kein beliebiges Ergebnis von einer Shell-Funktion zurückgeben. Sie können nur einen Statuscode zurückgeben, der eine Ganzzahl zwischen 0 und 255 ist. (Während Sie einen größeren Wert an übergeben können
return
, wird er modulo 256 abgeschnitten.) Der Wert muss 0 sein, um Erfolg anzuzeigen, und ein anderer Wert, um Fehler anzuzeigen. Konventionell sollten Sie sich an Fehlercodes zwischen 1 und 125 halten, da höhere Werte eine besondere Bedeutung haben (schlechter externer Befehl für 126 und 127, beendet durch ein Signal für höhere Werte).Da Sie hier ein Ja-Nein-Ergebnis zurückgeben, ist ein Statuscode angemessen. Da dies
flag
auf einen Erfolg oder Misserfolg hinweist, sollten Sie die herkömmlichen Werte 0 für Erfolg und 1 für Misserfolg verwenden (das Gegenteil von dem, was Sie geschrieben haben). Sie können Ihre Funktion dann direkt in einer if-Anweisung verwenden.Wenn Sie zwischen Fehlercodes unterscheiden müssen, rufen Sie die Funktion direkt auf. Unmittelbar nach der Rückkehr ist der Fehlercode in verfügbar
$?
. Sie können es dann mit einer case-Anweisung überprüfen:Wenn Sie den Statuscode später verwenden müssen, speichern Sie ihn in einer anderen Variablen, bevor er
$?
vom nächsten Befehl überschrieben wird.Was Sie geschrieben haben, hat nicht funktioniert, da die Befehlsersetzung
$(…)
auf die Ausgabe der Funktion erweitert wird, die in Ihrem Code entweder die Fehlermeldung oder leer ist, niemals1
.Wenn Sie mehr Informationen übergeben müssen, als ein Statuscode aus einer Shell-Funktion zulässt, haben Sie zwei Möglichkeiten:
$(valNum "$num")
quelle
Ich habe selbst in diesem Bereich widersprüchliche Ergebnisse erzielt. Hier sind Ergebnisse meiner empirischen Experimente. Erstens eine ' Theorie ' über Bash- oder * nix-Befehle:
Beispiel:
Ausgabe:
Wie gezeigt, gibt der
ls
Befehl den Statuscode = 2 zurück. Wenn Sie ein gültiges Verzeichnis versuchen, ist der Status Null ( 0 ). Nicht das gleiche wie fast alle anderen Sprachen.Regel # 1 - Machen Sie ...
Wir müssen uns daran erinnern, dass wir Fehlercodes in einer Bash- Anweisung testen
if
. Ich richte Konstanten ein, oder Sie können Shelltrue
oderfalse
Befehle verwenden.und Ausgabe:
Ich schlage jedoch vor, dass Sie @ Gilles eine " Up-Vote " geben, da seine Antwort die richtige ist. Ich wollte nur die vereinfachende Seite von ePaper auf den Punkt bringen.
Nur eine andere Sache, der
test
Befehl. Das sieht so aus:Meistens. Und zum Beispiel:
Null (0) ist wahr . Warum? Nun, die Manpage sagt, dass ein einzelnes Argument " wahr " ist, wenn es NICHT-NULL ist.
Verweise:
quelle