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 flag
parece 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.