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.
valNum ()
{
local flag=0
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo 1>&2 "Invalid Number"
flag=1
fi
return $flag
}
if valNum "$num"; then
#do something
fi
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:
valNum "$num"
case $? in …
Wenn Sie den Statuscode später verwenden müssen, speichern Sie ihn in einer anderen Variablen, bevor er $?
vom nächsten Befehl überschrieben wird.
valNum "$num"
valNum_status=$?
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, niemals 1
.
Wenn Sie mehr Informationen übergeben müssen, als ein Statuscode aus einer Shell-Funktion zulässt, haben Sie zwei Möglichkeiten:
- Drucken Sie Text in der Standardausgabe und rufen Sie die Funktion in einer Befehlsersetzung auf:
$(valNum "$num")
- Weisen Sie einer oder mehreren Variablen innerhalb der Funktion zu und lesen Sie diese Variablen später.