Você não pode retornar um resultado arbitrário de uma função do shell. Você só pode retornar um código de status que seja um inteiro entre 0 e 255. (Embora você possa passar um valor maior para return
, ele será truncado no módulo 256.) O valor deve ser 0 para indicar sucesso e um valor diferente para indicar falha; por convenção, você deve manter os códigos de erro entre 1 e 125, pois valores mais altos têm um significado especial (comando externo ruim para 126 e 127, morto por um sinal para valores mais altos).
Como você está retornando um resultado sim ou não aqui, um código de status é apropriado. Como flag
parece indicar um sucesso ou uma falha, você deve usar os valores convencionais de 0 para sucesso e 1 para falha (o oposto do que você escreveu). Você pode então usar sua função diretamente em uma declaração 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
Se você precisar discriminar entre os códigos de falha, chame a função diretamente. Imediatamente após o retorno, o código de falha está disponível em $?
. Você pode verificar isso com uma declaração de caso:
valNum "$num"
case $? in …
Se você precisar usar o código de status mais tarde, salve-o em outra variável antes que $?
seja sobrescrito pelo próximo comando.
valNum "$num"
valNum_status=$?
O que você escreveu não funcionou porque a substituição de comando $(…)
se expande para a saída da função, que em seu código é a mensagem de erro ou vazia, nunca 1
.
Se você precisar passar mais informações do que um código de status permite em algumas funções do shell, você tem duas possibilidades:
- Imprime algum texto na saída padrão e chama a função em uma substituição de comando:
$(valNum "$num")
- Atribua uma ou mais variáveis dentro da função e leia essas variáveis mais tarde.