Érték visszaadása egy bash függvényből

Van egy függvényem, amely 1-et ad vissza, ha a szám érvényes tízjegyű szám:

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 } 

Hívja:

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

A függvény jól működik, ha a szám érvényes, de szintaxist mutat hiba, ha érvénytelen számot ad meg.

Válasz

@choroba válasza helyes, de ez a példa egyértelműbb lehet:

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

Ez a példa egy kicsit hosszabb ($valNumResult beállítása, majd az adott érték lekérdezése), de egyértelműbben leírja, mi történik: hogy valNum() értéket ad vissza, és ez az érték lekérdezhető és tesztelhető.

PS Kérjük, tegyen meg egy szívességet, és adjon vissza 0 értéket a következőre: div id = “c03be70399″>

és nem nulla a false esetén. Így a visszatérési értékkel jelezheti, hogy “miért nem sikerült” a hiba esetén.

Válasz

A bash függvényei csak kilépési kódokat adhatnak vissza. Ezzel szemben a parancs behelyettesítésével kapjuk meg a parancs vagy függvény. Ezért a visszaküldött jelző ellenőrzéséhez nincs szükség cserére:

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

A működéséhez azonban 0-t kell adni, ha a szám érvényes, és 1, ha nem (a 0. kilépési kód nem jelent hibát).

Megjegyzések

  • Nem értem. A tldp.org/LDP/abs/html/complexfunct.html 24.7 példában a függvény a max értéket adja vissza, és nem a kilépési kódot. Bár a javaslata működik, de nem tudom megérteni, miért működik
  • mivel a teszt célja annak kiderítése, hogy a bemenet érvényes 10 jegyű egész szám, vagy sem, azaz igaz vagy hamis, a függvény 0 vagy 1 értéket ad vissza. choroba ' s példa azért működik, mert a if valnum "$num" egyenértékű azaz " ha igaz ". Az sh szkriptek alapszabálya az, hogy 0 = true / siker, nem nulla = hamis / hiba.
  • BTW, amely " Advanced Bash-Scripting Guide " nem ' ta nagyon jó útmutató – sok mindenben téved ' és néhány rossz forgatókönyv-gyakorlatot ösztönöz. a Bash GYIK a mywiki.wooledge.org/BashFAQ címen sokkal jobb erőforrás.
  • lásd: unix.stackexchange.com/questions/12236/ …
  • a funkciója sikertelen, mert visszhangozza a " Érvénytelen szám ", és ezután numerikus összehasonlítást hajt végre az adott karakterlánc és az 1 szám között a következővel: if [[ $(valNum $num) -eq 1 ]]

Válasz

Nem adhat vissza tetszőleges eredményt egy shell függvényből. Csak egy állapotkódot adhat vissza, amely 0 és 255 közötti egész szám. (Bár nagyobb értéket adhat át a return címre, ez a modulo csonkja 256.) Az értéknek 0-nak kell lennie. a siker és más érték a sikertelenség jelzésére; Megállapodás szerint ragaszkodnia kell az 1 és 125 közötti hibakódokhoz, mivel a magasabb értékeknek különleges jelentése van (rossz külső parancs a 126 és 127 esetében, a magasabb értékek jele által elpusztítva).

Mivel egy igen-vagy-nem eredmény, itt állapotkód megfelelő. Mivel úgy tűnik, hogy az flag sikert vagy kudarcot jelez, a sikerhez a 0, a kudarchoz az 1 értéket kell használnia (ellentétben azzal, amit írtál). Ezután közvetlenül használhatja a függvényét egy if utasításban.

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 

Ha különbséget kell tennie a hibakódok között, hívja közvetlenül a függvényt. Közvetlenül a visszatérése után a hibakód elérhető a $? fájlban. Ezután megteheti egy esetmeghatározással:

valNum "$num" case $? in … 

Ha később kell használni az állapotkódot, mentse el egy másik változóba a felülírja a következő parancs.

valNum "$num" valNum_status=$? 

Amit írt, nem működött, mert a kibővül a függvény kimenetére, amely a kódban vagy hibaüzenet, vagy üres, soha 1.

Ha szüksége van Ha több információt akar átadni, mint amennyit az állapotkód megenged a shell funkciókból, két lehetősége van:

  • Nyomtasson ki egy szöveget a szabványos kimenetre, és a függvényt parancs behelyettesítéssel hívja meg: $(valNum "$num")
  • Rendeljen hozzá egy vagy több változót a függvényen belül, és olvassa el később ezeket a változókat.

Válasz

Jómagam ellentmondásos eredményeket értem el ezen a területen. Íme az empirikus kísérleteim eredményei.Először is, néhány “ elmélet ” a bash vagy * nix parancsokról:

  • SIKER == 0 … ti. nincs hibakód kód)
  • FAIL              ! = 0 …… néhány állapotkód

Példa:

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

Kimenet:

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

Mint látható, a ls parancs visszaadja az állapotkódot = 2. Amikor érvényes könyvtárat próbál meg, az állapota nulla ( 0 ). Nem ugyanaz, mint szinte az összes többi nyelv.

rule # 1 – Készítsen …

  • IGAZ   == 0
  • HAMIS! = 0

Ne feledje, hogy tesztelünk hibakódokat egy Bash if utasítás. Állítok állandókat, vagy használhat shell true vagy false parancsokat.

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 

és output:

Invalid Number Not lucky. 

Javaslom azonban, hogy adjon meg bármilyen “ up-vote “@Gilles, mert a válasza a helyes. Csak le akartam keríteni az egyszerűsített oldalt az ePaperen.

Csak egy másik dolog, a test parancs. Ez így néz ki:

[[ some-expression ]]; 

Legtöbbször. És például:

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

Nulla (0) true . Miért? Nos, a man oldal azt mondja, hogy egyetlen argumentum “ true “, ha NEM NULL.

hivatkozások:

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük