Returnering af en værdi fra en bash-funktion

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

  • Jeg kan ikke få det. I eksemplet 24.7 i tldp.org/LDP/abs/html/complexfunct.html returnerer funktionen den maksimale værdi og ikke udgangskoden. Selvom dit forslag fungerer, men jeg er ikke i stand til at forstå, hvorfor det fungerer
  • da din test er at finde ud af, om input er et gyldigt 10-cifret heltal eller ikke, dvs. sand eller falsk, funktionen returnerer enten 0 eller 1. choroba ‘ s eksempel fungerer, fordi if valnum "$num" svarer til if valnum "$num" = 0 dvs. ” hvis det er sandt “. grundlæggende tommelfingerregel i sh-scripting er, at 0 = true / success, non-zero = false / error.
  • BTW, at ” Advanced Bash-Scripting Guide ” isn ‘ en meget god guide – det ‘ er forkert i mange ting og tilskynder til nogle dårlige scripting-fremgangsmåder. ofte stillede spørgsmål om Bash på mywiki.wooledge.org/BashFAQ er meget bedre ressource.
  • se unix.stackexchange.com/questions/12236/ …
  • din funktion mislykkes, fordi den ekko strengen ” Ugyldigt tal “, og du foretager derefter en numerisk sammenligning mellem den streng og tallet 1 med if [[ $(valNum $num) -eq 1 ]]

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”>
  • Tildel til en eller flere variabler inde i funktionen og læs disse variabler senere.
  • 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:

    Skriv et svar

    Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *