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 flagauf 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.