Você não pode retornar um resultado arbitrário de uma função de shell. Você só pode retornar um código de status que seja um número inteiro entre 0 e 255. (Embora você possa passar um valor maior para return, ele é 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 códigos de erro entre 1 e 125, pois valores mais altos têm um significado especial (comando externo ruim para 126 e 127, interrompido 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 flagparece indicar um sucesso ou falha, você deve usar os valores convencionais de 0 para sucesso e 1 para falha (o oposto do que você escreveu). Você pode usar sua função diretamente em uma instruçã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 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 verificá-lo com uma declaração de caso:
valNum "$num"
case $? in …
Se você precisar usar o código de status posteriormente, salve-o em outra variável antes de $?ser substituído pelo próximo comando.
valNum "$num"
valNum_status=$?
O que você escreveu não funcionou porque a substituição do comando se $(…)expande para a saída da função, que no seu código é a mensagem de erro ou está vazia, nunca 1.
Se você precisar passar mais informações do que um código de status permite que as funções fora do shell, você tem duas possibilidades:
- Imprima algum texto na saída padrão e chame a função em uma substituição de comando:
$(valNum "$num")
- Atribua a uma ou mais variáveis dentro da função e leia essas variáveis mais tarde.