LINUX.ORG.RU

Я обычно пробую прибавить единичку и смотрю что получается.

Kroz ★★★★★
()
$ (declare -i I; I=234; echo $I; )
234
$ (declare -i I; I="r234"; echo $I; )
0
schizoid ★★★
()

На ум пришел вот такой код

~ # read buff
12a
~ # let res=$buff/1
sh: let: arithmetic syntax error
~ # echo $?
2
~ # read buff
123
~ # let res=$buff/1
~ # echo $?
0
то есть результат получаем из переменной $?. Что правда let не дружит с типом double, но для проверки на число думаю сойдет (ошибок деления нет, код 0. Но результат удручающий, тут уже man let). Вариант еще попробовать echo $buff/1 | bc Правда пишу c работы из под оффтопика, а в msys bc нет.

Punk
()
Ответ на: комментарий от Komintern

грепай ввод на предмет чисел по регекспу.

Хех, не подумал). Думаю регекспом будет лучше.

Punk
()

Всем спасибо.

Othniel
() автор топика

if [[ «$1» =~ ^-?[0-9]+\.?[0-9]*$ ]]; then

psyX
()

Еще вариант с sed, вдруг кому еще пригодится:

#!/bin/sh
read -p "Enter number: " buff
if [[ -n $(echo $buff | sed -e 's/\([!0-9]*\)//g') ]]; then
        echo "Only number's!"   
        exit 1
fi
exit 0
Здесь через регексп удаляются все числа, если остались символы, то введено не верное число. Если требуется проверить отрицательные и/или дробное число, то можно в регексп дописать исключать точку и знак минуса, ну и думать как проверить скажем такую запись «00.0.0.---3». Думаю, что в последнем случае проще будет использовать проверку используя, например, утилиту bc.

Punk
()
Ответ на: комментарий от Punk

Тогда уж так, фигли:

$ echo asdf |python -c 'import sys; int(sys.stdin.read())'&>/dev/null && echo 1 || echo 0
0
$ echo 666 |python -c 'import sys; int(sys.stdin.read())'&>/dev/null && echo 1 || echo 0
1

uzbl
()
Ответ на: комментарий от uzbl

Вариант, что правда я сегодня столкнулся с отсутствием bc, python и все свои домыслы проверял на http://www.bellard.org/jslinux . Уж тем более хз что установлено у ТС.

Punk
()
Ответ на: комментарий от Othniel

согласен, не то ;) но вот вот это работает, правда только с интами:

#!/bin/sh
function isnumber
{
        /bin/test $1 -eq $1 2>/dev/null
}

function try
{
        if isnumber $1; then
                echo $1 is int
        else
                echo $1 is not int
        fi
}

try 555

try aaa

beastie ★★★★★
()
Ответ на: комментарий от beastie

Спасибо, наверное наиболее подходящий вариант.

Othniel
() автор топика
Ответ на: комментарий от const86

дабы родной, встроенный под ногами не мешался, а то в bash работает, а в ksh нет, или наоборот, не помню ;)

beastie ★★★★★
()
Ответ на: комментарий от beastie

Ну исходник этого /bin/test тоже в камне не высечен. У меня вот даже не в /bin лежит. Глянул по диагонали посиксный ман по test, не нашёл что будет, если в -eq подсунуть не то.

const86 ★★★★★
()
Ответ на: комментарий от const86

не нашёл что будет, если в -eq подсунуть не то

будет «invalid integer» и err 2

У меня вот даже не в /bin лежит.

а тут согласет, линуксята его зачем-то в /usr/bin засунули :-/

quick fix: `which test` $1 -eq $1

beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.