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
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:
if valnum "$num"
vastaaif valnum "$num" = 0
ts. ", jos se on totta ". sh-komentosarjojen perussääntö on, että 0 = tosi / menestys, ei nolla = väärä / virhe.if [[ $(valNum $num) -eq 1 ]]