Duas condições em if (somente números positivos sem letras)

0

Eu tenho que escrever um script que aceite apenas números positivos e não letras / palavras.

Criei duas condições se não funcionam juntas. Quando eu apago um, o outro funciona perfeitamente bem. Como posso conectá-los?

    if [[ ${@:2} -lt 0 ]]; then
        shift
        echo "error, only positive"
        exit 3
    fi

    if [[ ${@:2} == [a-zA-Z] ]]; then
        echo "error, no letters allowed"
        exit 4
    fi

Meu script é executado por esta linha: %código% então qualquer arg1, arg2 não pode ser por exemplo -1 ou a.

    
por codddeer123 22.12.2016 / 15:38

2 respostas

2

Você provavelmente deve iterar todos os argumentos e testar cada um deles, e se você está bem com um único teste para as duas coisas, você pode fazer algo como o seguinte, o que garantirá que todos os argumentos tenham apenas dígitos.- ou letras, mas também sem decimal)

pattern='[^0-9]'
for arg; do
    if [[ $arg =~ $pattern ]]; then
        printf 'Unacceptable option: %s\n' "$arg"
        exit 3
    fi
done

se você quiser que os testes separados tenham mensagens de erro e códigos de saída diferentes, você pode fazer os que estão dentro do loop for e testar arg , o que fará com que cada opção de linha de comando seja

    
por 22.12.2016 / 15:59
2

Você também pode aproveitar os operadores de comparação bash como este:

if [ $arg -eq $arg -a $arg -ge 0 ] 2>/dev/null ;then  
  echo "accepted"
else 
  echo "not accepted"
fi 

O truque é que, se você comparar com -eq, dois argumentos não numéricos bash irão gerar um erro (que enviamos para / dev / null).

    
por 22.12.2016 / 18:17