Подтвердить что ты не робот

Есть ли простой способ определить, является ли пользовательский ввод целым числом в bash?

Я новый студент для bash сценариев, и я в тупике задаю вопрос. Мне было интересно, есть ли простой способ определить, является ли вход пользователя целочисленным или нет. Более конкретно, если пользователю предлагается ввести целое число, есть ли быстрая проверка для подтверждения?

4b9b3361

Ответ 1

Это своего рода kludge, он использует -eq для чего-то другого, чем он был предназначен, но он проверяет целое число, если он не находит int, он возвращает как ошибку, которую вы можете отправить в /dev/null и значение false.

read input
if [ $input -eq $input 2>/dev/null ]
then
     echo "$input is an integer"
else
    echo "$input is not an integer"
fi

Ответ 2

Один из способов - проверить, содержит ли он символы, отличные от числа. Вы заменяете все цифры цифрами ничем и проверяете длину - если там есть нецифровые символы.

if [[ -n ${input//[0-9]/} ]]; then
    echo "Contains letters!"
fi

Другой подход - проверить, равна ли переменная, оцениваемая в арифметическом контексте, самой себе. Это bash -специфический

if [[ $((foo)) != $foo ]]; then
    echo "Not just a number!"
fi

Ответ 3

Вы можете проверить, используя регулярное выражение

if ! [[ "$yournumber" =~ ^[0-9]+$ ]] ; 
 then exec >&2; echo "error: Not a number"; exit 1
fi

Ответ 6

Вот еще один способ сделать это. Это, вероятно, немного более сложное, чем необходимо в большинстве случаев, но также будет обрабатывать десятичные знаки. Я написал код ниже, чтобы получить округленный номер. Он также проверяет числовой ввод в процессе.

    #--- getRound -- Gives number rounded to nearest integer -----------------------
    #    usage: getRound <inputNumber>
    #
    #    echos the rounded number
    #    Best to use it like:
    #      roundedNumber=`getRound $Number`
    #      check the return value ($?) and then process further
    #
    #    Return Value:
    #      2 - if <inputNumber> is not passed, or if more arguments are passed
    #      3 - if <inputNumber> is not a positive number
    #      0 - if <inputNumber> is successfully rounded
    #
    #    Limitation: Cannot be used for negative numbers
    #-------------------------------------------------------------------------------
    getRound (){
        if [ $# -ne 1 ]
        then
            exit 2
        fi

        #--- Check if input is a number
        Input=$1
        AB=`echo A${Input}B | tr -d [:digit:] | tr -d '.'`
        if [ "${AB}" != "AB" ] #--- Allow only '.' and digit
        then
            exit 3
        fi
        DOTorNone=`echo ${Input} | tr -d [:digit:]` #--- Allow only one '.'
        if [ "${DOTorNone}" != "" ] && [ "${DOTorNone}" != "." ]
        then
            exit 3
        fi

        echo $Input | awk '{print int($1+0.5)}' #--- Round to nearest integer
    }

    MyNumber=`getRound $1`
    if [ $? -ne 0 ]
    then
        echo "Empty or invalid input passed"
    else
        echo "Rounded input: $MyNumber"
    fi