Mám funkci, která vrací 1, pokud je číslo platné desetimístné číslo:
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 } 
Začíná to volat:
if [[ $(valNum $num) -eq 1 ]]; then #do something fi 
Funkce funguje dobře, pokud je číslo platné, ale zobrazuje syntaxi chyba, pokud zadáte neplatné číslo.
Odpověď
Odpověď @choroba je správná, ale tento příklad může být jasnější:
valNum $num valNumResult=$? # "$?" is the return value of the previous command if [[ $valNumResult -eq 1 ]] then : # do something fi 
 Tento příklad je o něco delší (nastavení $valNumResult poté dotazování na tuto hodnotu), ale konkrétněji popisuje, co se stane: valNum() vrací hodnotu a tuto hodnotu lze vyhledávat a testovat. 
 PS Udělejte si laskavost a vraťte 0 pro true a nenulové pro false. Takto můžete pomocí návratové hodnoty v případě selhání uvést „proč jsme selhali“. 
Odpověď
Funkce v bash mohou vrátit pouze kódy ukončení. Substituce příkazu se naopak používá k získání standardního výstupu příkaz nebo funkce. Proto pro kontrolu vráceného příznaku nepotřebujete substituci:
if valNum "$num" ; then # ... fi 
Aby to ale fungovalo, měli byste vrátit 0, pokud číslo je platné, a 1, pokud není (kód ukončení 0 znamená žádnou chybu).
Komentáře
Odpověď
 Z funkce shellu nemůžete vrátit libovolný výsledek. Můžete vrátit pouze stavový kód, který je celé číslo mezi 0 a 255. (I když můžete předat větší hodnotu return, je to zkrácené modulo 256.) Hodnota musí být 0 označit úspěch a jinou hodnotu označit neúspěch; podle konvence byste se měli držet chybových kódů mezi 1 a 125, protože vyšší hodnoty mají zvláštní význam (špatný externí příkaz pro 126 a 127, zabitý signálem pro vyšší hodnoty). 
 Protože vracíte výsledek ano-ne, je vhodný stavový kód. Protože flag naznačuje úspěch nebo neúspěch, měli byste použít konvenční hodnoty 0 pro úspěch a 1 pro neúspěch (opak toho, co jste napsali). Poté můžete svoji funkci použít přímo v příkazu if. 
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 
 Pokud potřebujete rozlišovat mezi poruchovými kódy, zavolejte funkci přímo. Okamžitě po jeho návratu je kód chyby k dispozici v $?. Poté jej můžete zkontrolovat pomocí příkazu case: 
valNum "$num" case $? in … 
 Pokud budete později potřebovat použít stavový kód, uložte jej do jiné proměnné před $? je přepsán dalším příkazem. 
valNum "$num" valNum_status=$? 
 To, co jste napsali, nefunguje, protože nahrazení příkazu $(…) se rozšíří na výstup funkce, která je ve vašem kódu buď chybová, nebo prázdná, nikdy 1. 
Pokud potřebujete předat více informací, než umožňuje stavový kód z funkcí prostředí, máte dvě možnosti:
-  Vytisknout nějaký text na standardní výstup a zavolat funkci v substituci příkazu: 
$(valNum "$num") - Přiřadit jedné nebo více proměnným uvnitř funkce a tyto proměnné si přečíst později.
 
Odpovědět
Sám jsem měl v této oblasti konfliktní výsledky. Zde jsou výsledky mých empirických experimentů.Nejprve nějaká „ teorie “ o příkazech bash nebo * nix:
- SUCCESS == 0 … viz. žádný chybový stavový kód)
 - FAIL ! = 0 …… nějaký stavový kód
 
Příklad:
if ls -lt /nonexistantdir then echo "found" else echo "FAIL" fi # echo ls -lt /nonexistantdir; echo "status = $?" echo "status = $?" 
Výstup:
ls: cannot access "/nonexistantdir": No such file or directory FAIL... ls: cannot access "/nonexistantdir": No such file or directory status = 2 
 Jak je ukázáno, příkaz ls vrací status code = 2. Při pokusu o platný adresář je stav nulový ( 0 ). Ne stejné jako téměř ve všech ostatních jazycích. 
pravidlo # 1 – Vytvořit …
- TRUE == 0
 - FALSE! = 0
 
 Musíme si uvědomit, že  testujeme  chybové kódy v Bash if prohlášení. Nastavím konstanty, nebo můžete použít příkazy shell true nebo 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 
a výstup:
Invalid Number Not lucky. 
Navrhuji však dát jakýkoli „ up-vote „@Gilles, protože jeho odpověď je správná. Chtěl jsem jen dostat zjednodušující stránku dolů na ePaper.
 Ještě jedna věc,  test  příkaz. Vypadá to takto: 
[[ some-expression ]]; 
Většinu času. A například:
$ test 1 $ echo "result = $?" result = 0 $ test 0 $ echo "result = $?" result = 0 
Nula (0) je true . Proč? Stránka man říká, že jediný argument je „ true “, pokud není NULL.
odkazy:
if valnum "$num"je ekvivalentníif valnum "$num" = 0tj. " pokud je to pravda ". základním pravidlem sh skriptování je, že 0 = true / success, non-zero = false / error.if [[ $(valNum $num) -eq 1 ]]