Eu tenho uma função que retorna 1 se o número for um número válido de dez dígitos:
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
}
Está sendo chamado por:
if [[ $(valNum $num) -eq 1 ]]; then
#do something
fi
A função está funcionando bem se o número for válido, mas está mostrando um erro de sintaxe se você inserir um número inválido.
fonte
if valnum "$num"
é equivalente aif valnum "$num" = 0
"se for verdadeiro". A regra básica básica nos scripts sh é que 0 = verdadeiro / sucesso, diferente de zero = falso / erro.if [[ $(valNum $num) -eq 1 ]]
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.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: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.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, nunca1
.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:
$(valNum "$num")
fonte
Eu mesmo tive resultados conflitantes nessa área. Aqui estão os resultados de minhas experiências empíricas. Primeiramente, alguma ' teoria ' sobre comandos bash ou * nix:
Exemplo:
Resultado:
Como mostrado, o
ls
comando retorna o código de status = 2. Quando você tenta um diretório válido, o status é zero ( 0 ). Não é o mesmo que quase todos os outros idiomas.regra # 1 - Faça ...
Devemos lembrar que estamos testando códigos de erro em uma
if
instrução Bash . Eu configuro constantes ou você pode usar shelltrue
oufalse
comandos.e saída:
No entanto, sugiro que você dê @Gilles ' up-vote ' porque sua resposta é a correta. Eu só queria entender o lado simplista do ePaper.
Apenas mais uma coisa, o
test
comando. Isso se parece com:A maior parte do tempo. E por exemplo:
Zero (0) sendo verdadeiro . Por quê? Bem, a página de manual diz que um único argumento é ' verdadeiro ' quando NÃO é NULL.
referências:
fonte