BASH verificar se argv é um número entre 0 e 100 [duplicado]

1

Meu script atual

checkargv='^[0-9]+$'
if ! [[ $1 =~ $checkargv ]]
        then
        echo "[!] How many times? $0 [number]" >&2
        exit 1
fi

for (( i=1;i<=$1;i++ ))
do
        x=$[($RANDOM % 100) + 1]
        ./script.sh $x
done

meu argv $ 1 aceita agora qualquer número de 0 a não importa, como posso fazer o argv aceitar números apenas de 0 a 100

    
por John Doe 02.08.2018 / 18:31

2 respostas

1
if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then
    echo 'error (out of range)' >&2
    exit 1
fi

Isso pressupõe que a coisa em $1 seja, na verdade, um inteiro. Você pode verificar isso antes com

case "$1" in
    ("" | *[!0-9]*)
        echo 'error (not a positive decimal integer number)' >&2
        exit 1
esac

Isso acionará o exit se $1 contiver algo diferente de dígitos decimais ou estiver vazio.

Combinando estes:

case "$1" in
    ("" | *[!0-9]*)
        echo 'error (not a positive decimal integer number)' >&2
        exit 1
        ;;
    *)
        if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then
            echo 'error (out of range)' >&2
            exit 1
        fi
esac

Mas fazer um após o outro pode parecer melhor:

case "$1" in
    ("" | *[!0-9]*)
        echo 'error (not a positive decimal integer number)' >&2
        exit 1
esac

if [ "$1" -lt 1 ] || [ "$1" -gt 100 ]; then
    echo 'error (out of range)' >&2
    exit 1
fi

Tenha em atenção que [ operadores aritméticos sempre consideram números como decimais mesmo que iniciem com 0 , enquanto as expansões aritméticas da shell nas cascas POSIX considerariam números começando com 0 como octal (0100 é 100 para [ , mas 64 para $((...)) ).

    
por 02.08.2018 / 18:36
0

Use aritmética em vez de regex:

if ! (( num >= 0 && num <= 100 ))

(Isto assume que num é numérico. Se você também precisa verificar se $ num é numérico, então use o regex também.)

    
por 02.08.2018 / 18:39

Tags