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
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:
if valnum "$num"
egyenértékű azaz " ha igaz ". Az sh szkriptek alapszabálya az, hogy 0 = true / siker, nem nulla = hamis / hiba.if [[ $(valNum $num) -eq 1 ]]