Jeg har en funktion, der returnerer 1, hvis tallet er et gyldigt ti-cifret nummer:
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 }
Det bliver kaldt af:
if [[ $(valNum $num) -eq 1 ]]; then #do something fi
Funktionen fungerer fint, hvis nummeret er gyldigt, men viser syntaksen fejl, hvis du indtaster et ugyldigt nummer.
Svar
@chorobas svar er korrekt, men dette eksempel kan være klarere:
valNum $num valNumResult=$? # "$?" is the return value of the previous command if [[ $valNumResult -eq 1 ]] then : # do something fi
Dette eksempel er lidt længere (indstilling af $valNumResult
og derefter forespørgsel på denne værdi), men mere eksplicit beskriver hvad der sker: at valNum()
returnerer en værdi, og den værdi kan forespørges og testes.
PS Venligst gør dig selv en tjeneste, og returner 0
for true
og ikke-nul for false
. På den måde kan du bruge returværdien til at angive “hvorfor vi mislykkedes” i fejlsagen.
Svar
Funktioner i bash kan kun returnere exit-koder. Kommandosubstitutionen er omvendt brugt til at få standardoutput af en For at kontrollere det returnerede flag behøver du ikke erstatningen:
if valNum "$num" ; then # ... fi
Men for at det skal fungere, skal du returnere 0, hvis nummeret er gyldigt, og 1 hvis det ikke er tilfældet (udgangskode 0 betyder ingen fejl).
Kommentarer
Svar
Du kan ikke returnere et vilkårligt resultat fra en shell-funktion. Du kan kun returnere en statuskode, der er et heltal mellem 0 og 255. (Mens du kan videregive en større værdi til return
, er den afkortet modulo 256.) Værdien skal være 0 at indikere succes og en anden værdi for at indikere fiasko; ved konvention skal du holde dig til fejlkoder mellem 1 og 125, da højere værdier har en særlig betydning (dårlig ekstern kommando for 126 og 127, dræbt af et signal for højere værdier).
Da du returnerer en ja-eller-nej resultat her, en statuskode er passende. Da flag
synes at indikere en succes eller fiasko, skal du bruge de konventionelle værdier 0 for succes og 1 for fiasko (det modsatte af det, du skrev). Du kan derefter bruge din funktion direkte i en if-sætning.
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
Hvis du har brug for at skelne mellem fejlkoder, skal du ringe til funktionen direkte. Umiddelbart efter at den er vendt tilbage, er fejlkoden tilgængelig i $?
. Du kan derefter kontrollere det med en sagserklæring:
valNum "$num" case $? in …
Hvis du skal bruge statuskoden senere, skal du gemme den i en anden variabel før $?
overskrives af den næste kommando.
valNum "$num" valNum_status=$?
Det, du skrev, fungerede ikke, fordi kommandosubstitutionen $(…)
udvides til funktionens output, som i din kode enten er fejlmeddelelsen eller tom, aldrig 1
.
Hvis du har brug for for at videregive flere oplysninger, end en statuskode tillader ud af en shell-funktion, har du to muligheder:
- Udskriv noget tekst på standardoutput, og kald funktionen i en kommandosubstitution: “d67936d848”>
Svar
Jeg har selv haft modstridende resultater på dette område. Her er resultater fra mine empiriske eksperimenter.For det første nogle “ teori ” om bash- eller * nix-kommandoer:
- SUCCESS == 0 … dvs. ingen fejlstatuskode)
- FAIL ! = 0 …… noget statuskode
Eksempel:
if ls -lt /nonexistantdir then echo "found" else echo "FAIL" fi # echo ls -lt /nonexistantdir; echo "status = $?" echo "status = $?"
Output:
ls: cannot access "/nonexistantdir": No such file or directory FAIL... ls: cannot access "/nonexistantdir": No such file or directory status = 2
Som vist returnerer kommandoen ls
statuskode = 2. Når du prøver et gyldigt bibliotek, er status nul ( 0 ). Ikke det samme som næsten alle andre sprog.
regel # 1 – Lav …
- SAND == 0
- FALSE! = 0
Vi skal huske, at vi tester fejlkoder i en Bash if
udsagn. Jeg har konfigureret konstanter, eller du kan bruge kommandoer shell true
eller false
.
TRUE=0 FALSE=1 # valid number function # valNum() { flag=$TRUE 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=$FALSE fi return $flag } # later on ... # if validNum Abc then echo "Lucky number" else echo "Not lucky." fi
og output:
Invalid Number Not lucky.
Jeg foreslår dog, at du giver enhver “ up-vote “@ Gilles, fordi hans svar er det rigtige. Jeg ville bare få den forenklede side ned på ePaper.
Bare en anden ting, test
kommando. Dette ser ud som:
[[ some-expression ]];
Det meste af tiden. Og for eksempel:
$ test 1 $ echo "result = $?" result = 0 $ test 0 $ echo "result = $?" result = 0
Zero (0) being true . Hvorfor? Nå siger mandsiden, at et enkelt argument er “ sand “, når det IKKE er NULL.
referencer:
if valnum "$num"
svarer tilif valnum "$num" = 0
dvs. ” hvis det er sandt “. grundlæggende tommelfingerregel i sh-scripting er, at 0 = true / success, non-zero = false / error.if [[ $(valNum $num) -eq 1 ]]