Palautetaan arvo bash-funktiosta

Minulla on funktio, joka palauttaa arvon 1, jos luku on kelvollinen kymmenen numeroinen luku:

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 } 

Soitetaan:

if [[ $(valNum $num) -eq 1 ]]; then #do something fi 

Toiminto toimii hyvin, jos numero on kelvollinen, mutta näyttää syntaksia virhe, jos syötät virheellisen numeron.

vastaus

@choroba vastaus on oikea, mutta tämä esimerkki saattaa olla selkeämpi:

valNum $num valNumResult=$? # "$?" is the return value of the previous command if [[ $valNumResult -eq 1 ]] then : # do something fi 

Tämä esimerkki on hieman pidempi (asetus $valNumResult ja kysytään sitten kyseiseltä arvolta), mutta kuvailee tarkemmin mitä tapahtuu: että valNum() palauttaa arvon, ja arvoa voidaan kysellä ja testata.

PS Tee itsellesi palvelus ja palauta 0 arvolle true ja nollasta poikkeava arvo false. Tällä tavoin voit käyttää palautusarvoa osoittamaan, miksi epäonnistumme vikatapauksessa.

Vastaus

Bash-funktiot voivat palauttaa vain poistumiskoodit. Komennon korvaamista käytetään päinvastoin saamaan komento tai toiminto. Siksi palautetun lipun tarkistamiseksi sinun ei tarvitse korvata:

if valNum "$num" ; then # ... fi 

Mutta jotta se toimisi, palauta 0, jos numero on kelvollinen, ja 1, jos se ei ole (poistumiskoodi 0 ei tarkoita virhettä).

Kommentit

  • En saa sitä. Esimerkissä 24.7 kohdassa tldp.org/LDP/abs/html/complexfunct.html funktio palauttaa enimmäisarvon eikä poistumiskoodia. Vaikka ehdotuksesi toimii, mutta en pysty ymmärtämään miksi se toimii
  • koska testisi tarkoituksena on selvittää onko syötteessä voimassa oleva 10-numeroinen kokonaisluku vai ei, siis tosi vai väärä, funktio palauttaa joko 0 tai 1. choroba ' -esimerkki toimii, koska if valnum "$num" vastaa if valnum "$num" = 0 ts. ", jos se on totta ". sh-komentosarjojen perussääntö on, että 0 = tosi / menestys, ei nolla = väärä / virhe.
  • BTW, että " Bash-Scripting Advanced Guide " ei ole ' ta erittäin hyvä opas – se ' väärässä monissa asioissa ja rohkaisee joitain huonoja komentosarjojen käytäntöjä. Bashin usein kysytyt kysymykset osoitteessa mywiki.wooledge.org/BashFAQ on paljon parempi resurssi.
  • katso unix.stackexchange.com/questions/12236/ …
  • funktiosi epäonnistuu, koska se toistaa merkkijonoa " Virheellinen numero ", ja teet sitten numeerisen vertailun merkkijonon ja numeron 1 välillä if [[ $(valNum $num) -eq 1 ]]

Vastaa

Et voi palauttaa mielivaltaista tulosta kuoritoiminnosta. Voit palauttaa vain tilakoodin, joka on kokonaisluku välillä 0 ja 255. (Vaikka voit välittää suuremman arvon return, se on katkaistu moduuli 256.) Arvon on oltava 0 osoittamaan menestystä ja erilainen arvo osoittamaan epäonnistumista; sopimuksen mukaan kannattaa pitää kiinni virhekoodeista välillä 1 ja 125, koska suuremmilla arvoilla on erityinen merkitys (huono ulkoinen komento 126: lle ja 127: lle, tappaa signaali suuremmille arvoille).

Koska palautat kyllä-ei-tulos tässä, tilakoodi on sopiva. Koska flag näyttää viittaavan onnistumiseen tai epäonnistumiseen, sinun on käytettävä tavanomaisia arvoja 0 menestykseen ja 1 epäonnistumiseen (päinvastoin kuin kirjoitit). Voit käyttää toimintoa suoraan if-käskyssä.

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 

Jos sinun on erotettava vikakoodit, soita funktioon suoraan. Heti palautumisen jälkeen vikakoodi on käytettävissä kohdassa $?. Sen jälkeen voit tarkistaa sen tapauslausekkeella:

valNum "$num" case $? in … 

Jos haluat käyttää tilakoodia myöhemmin, tallenna se toiseen muuttujaan ennen .

valNum "$num" valNum_status=$? 

Kirjoituksesi ei toiminut, koska komennon korvaaminen $(…) laajenee toiminnon lähtöön, joka koodissasi on joko virheilmoitus tai tyhjä, ei koskaan 1.

Jos tarvitset Jos haluat välittää enemmän tietoja kuin tilakoodi sallii shell-toimintojen, sinulla on kaksi mahdollisuutta:

  • Tulosta tekstiä vakiotulosteeseen ja kutsu funktio komentokorvalla: $(valNum "$num")
  • Määritä yhdelle tai useammalle muuttujalle funktion sisällä ja lue nämä muuttujat myöhemmin.

Vastaa

Minulla on ollut ristiriitaisia tuloksia tällä alueella. Tässä on tuloksia empiirisistä kokeistani.Ensinnäkin joitain ” teoria ” bash- tai * nix-komennoista:

  • MENESTYS == 0 … nimittäin. ei virhekoodikoodia)
  • FAIL              ! = 0 …… jokin tilakoodi

Esimerkki:

if ls -lt /nonexistantdir then echo "found" else echo "FAIL" fi # echo ls -lt /nonexistantdir; echo "status = $?" echo "status = $?" 

Tulos:

ls: cannot access "/nonexistantdir": No such file or directory FAIL... ls: cannot access "/nonexistantdir": No such file or directory status = 2 

Kuten on esitetty, komento ls palauttaa tilakoodin = 2. Kun yrität kelvollista hakemistoa, tila on nolla ( 0 ). Ei sama kuin melkein kaikki muut kielet.

sääntö # 1 – Tee …

  • TOSI   == 0
  • EPÄTOSI! = 0

Meidän on muistettava, että testaamme virhekoodeja Bashissa if -lauseke. Asetan vakioita, tai voit käyttää komentoja shell true tai 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 

ja lähtö:

Invalid Number Not lucky. 

Ehdotan kuitenkin, että annat minkä tahansa ” ylösäänestys ”@Gilles, koska hänen vastauksensa on oikea. Halusin vain saada yksinkertaistetun puolen alaspäin ePaperiin.

Vain yksi asia, test -komento. Tämä näyttää tältä:

[[ some-expression ]]; 

Suurimman osan ajasta. Ja esimerkiksi:

$ test 1 $ echo "result = $?" result = 0 $ test 0 $ echo "result = $?" result = 0 

Nolla (0) on true . Miksi? No, man-sivu sanoo, että yksi argumentti on ” tosi ”, kun se ei ole NULL.

viittaa:

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *