URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9126
[ Назад ]

Исходное сообщение
"Нужно проверить переменную, не число ли.?"

Отправлено universite , 12-Май-11 00:12 
Так не работает. :(

if [[ "$1"  =~ "^[0-9]+$" ]]; then
      ...
fi


Содержание

Сообщения в этом обсуждении
"Нужно проверить переменную, не число ли.?"
Отправлено ImPressed , 12-Май-11 02:22 
> Так не работает. :(
>
 
> if [[ "$1"  =~ "^[0-9]+$" ]]; then
>       ...
> fi
>

Используйте grep/egrep для этих целей


"Нужно проверить переменную, не число ли.?"
Отправлено ACCA , 12-Май-11 02:36 
N=$(expr $1 + 0 2>dev/null) || echo Не число


"Нужно проверить переменную, не число ли.?"
Отправлено universite , 12-Май-11 15:12 
> N=$(expr $1 + 0 2>dev/null) || echo Не число

Это не красиво.
Но если ни один из вариантов не прокатит - применю


"Нужно проверить переменную, не число ли.?"
Отправлено DeadLoco , 12-Май-11 17:44 
> N=$(expr $1 + 0 2>dev/null) || echo Не число

$( echo $1 | egrep "^[0-9]*\.[0-9]+$" ) || echo NEIN


"Нужно проверить переменную, не число ли.?"
Отправлено LSTemp , 12-Май-11 04:03 
> Так не работает. :(
>
 
> if [[ "$1"  =~ "^[0-9]+$" ]]; then
>       ...
> fi
>

if [ -z "${1//[0-9]/}" ]
then
число
fi

PS
способ от ACCA - вообще учебник, куда и что вставлять :)


"Нужно проверить переменную, не число ли.?"
Отправлено universite , 12-Май-11 15:31 
>> Так не работает. :(
>>
 
>> if [[ "$1"  =~ "^[0-9]+$" ]]; then
>>       ...
>> fi
>>

> if [ -z "${1//[0-9]/}" ]
> then
> число
> fi

Спасибо, заработало.


"Нужно проверить переменную, не число ли.?"
Отправлено sany , 12-Май-11 19:11 
>[оверквотинг удален]
>>>
 
>>> if [[ "$1"  =~ "^[0-9]+$" ]]; then
>>>       ...
>>> fi
>>>

>> if [ -z "${1//[0-9]/}" ]
>> then
>> число
>> fi
> Спасибо, заработало.

Это не верно, ${1//[0-9]/} это башизм.


"Нужно проверить переменную, не число ли.?"
Отправлено universite , 12-Май-11 19:55 

> Это не верно, ${1//[0-9]/} это башизм.

Скрипт все равно использует массив и $RANDOM, поэтому bash необходим.

P.S. Можно конечно, попробовать все переписать под sh ...


"Нужно проверить переменную, не число ли.?"
Отправлено LSTemp , 15-Май-11 00:16 
>[оверквотинг удален]
>>>> if [[ "$1"  =~ "^[0-9]+$" ]]; then
>>>>       ...
>>>> fi
>>>>

>>> if [ -z "${1//[0-9]/}" ]
>>> then
>>> число
>>> fi
>> Спасибо, заработало.
> Это не верно, ${1//[0-9]/} это башизм.

не надо узко мыслить.

это показ одного из методов решения данной задачи. реализация обработки регулярных выражений может быть в каждой конкретной ОС весьма специфична (в том числе и и за багов).

банальную замену символов на ура можно выполнить 1000 и одним вариантом, а не только с помощью шелл.


"Нужно проверить переменную, не число ли.?"
Отправлено phpcoder , 12-Май-11 06:39 
http://unix.stackexchange.com/questions/12253/checking-an-ar...

"Нужно проверить переменную, не число ли.?"
Отправлено universite , 12-Май-11 15:10 
> http://unix.stackexchange.com/questions/12253/checking-an-ar...

Ни один из вариантов не заработал


"Нужно проверить переменную, не число ли.?"
Отправлено erera22 , 12-Май-11 15:42 
echo "${1}" | grep -vE "[a-zA-Z]" > /dev/null ; retval=$? ; echo ${retval}

"Нужно проверить переменную, не число ли.?"
Отправлено sany , 12-Май-11 19:09 
Удивлён кол-вом неправильных решений.

для проверки, что $1 удовлетворяет выражению "expr" нужно использовать конструкцию
(echo "$1" | grep -E -q "expr")
это POSIX-корректное выражение

для проверки, что $1 целое(положительное или отрицательное) можно expr взять, например, равным ^-?[0-9]+$


то есть:

if (echo "$1" | grep -E -q "^-?[0-9]+$"); then
  ...
fi


"Нужно проверить переменную, не число ли.?"
Отправлено ACCA , 12-Май-11 23:10 
> для проверки, что $1 целое(положительное или отрицательное) можно expr взять, например,
> равным ^-?[0-9]+$

И что получится для аргумента " -333 ", выдернутого из файла каким-нибудь cut -c ?


"Нужно проверить переменную, не число ли.?"
Отправлено universite , 12-Май-11 23:51 
>> для проверки, что $1 целое(положительное или отрицательное) можно expr взять, например,
>> равным ^-?[0-9]+$
> И что получится для аргумента " -333 ", выдернутого из файла каким-нибудь
> cut -c ?

Стоп господа!
Мне надо проверка на целые натуральные числа.


"Нужно проверить переменную, не число ли.?"
Отправлено ACCA , 13-Май-11 00:35 
> Мне надо проверка на целые натуральные числа.

Целое натуральное число может быть с пробелами, если его сунули в файл каким-нибудь printf "%7i", а ты его дёрнул из файла каким-нибудь cut -c 1-7. Например "    333". А могли сунуть printf "%-7i", тогда ты получишь "333    ".


"Нужно проверить переменную, не число ли.?"
Отправлено LSTemp , 15-Май-11 02:04 
>> Мне надо проверка на целые натуральные числа.
> Целое натуральное число может быть с пробелами, если его сунули в файл
> каким-нибудь printf "%7i", а ты его дёрнул из файла каким-нибудь cut
> -c 1-7. Например "    333". А могли сунуть
> printf "%-7i", тогда ты получишь "333    ".

это дело обработки входных данных и к топику не относится. может еще обсудим исключение комментариев во входных данных и всего прочего "что могло бы быть"?



"Нужно проверить переменную, не число ли.?"
Отправлено sany , 13-Май-11 03:04 
>> для проверки, что $1 целое(положительное или отрицательное) можно expr взять, например,
>> равным ^-?[0-9]+$
> И что получится для аргумента " -333 ", выдернутого из файла каким-нибудь
> cut -c ?

в таких случаях правильное поведение - ошибка разбора, программист сам должен позаботиться сделать trim для строки перед разбором, а если лень, то регулярное выражение не сложно подправить.


"Нужно проверить переменную, не число ли.?"
Отправлено Andrey Mitrofanov , 13-Май-11 11:11 
> Так не работает. :(
> if [[ "$1"  =~ "^[0-9]+$" ]]; then

А вот так работает...
[[ "$1"  =~ ^[0-9]+$ ]];


Баг?... Или недоступно глубокое знание из man bash?? :-O


"Нужно проверить переменную, не число ли.?"
Отправлено universite , 14-Май-11 05:03 
>> Так не работает. :(
>> if [[ "$1"  =~ "^[0-9]+$" ]]; then
> А вот так работает...
> [[ "$1"  =~ ^[0-9]+$ ]];
> Баг?... Или недоступно глубокое знание из man bash?? :-O

Хммм. Сработало.
# /usr/local/bin/bash --version
GNU bash, version 4.1.10(1)-release (amd64-portbld-freebsd8.2)


"Нужно проверить переменную, не число ли.?"
Отправлено LSTemp , 15-Май-11 00:10 
>> Так не работает. :(
>> if [[ "$1"  =~ "^[0-9]+$" ]]; then
> А вот так работает...
> [[ "$1"  =~ ^[0-9]+$ ]];
> Баг?... Или недоступно глубокое знание из man bash?? :-O

одно из двух...

[sysrha@local ~]$ bash --version
GNU bash, version 3.00.16(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

[sysrha@local ~]$ a='123'; echo -n "$a - "; [[ "$a" =~ '^[0-9]+$' ]] && echo NO || echo YES
123 - NO

[sysrha@local ~]$ a='_123'; echo -n "$a - "; [[ "$a" =~ '^[0-9]+$' ]] && echo NO || echo YES
_123 - YES



"Оно! Нашёл."
Отправлено Andrey Mitrofanov , 16-Май-11 10:10 
>> Баг?... Или недоступно глубокое знание из man bash?? :-O
> одно из двух...

Аааа! Это Оно, Великое Знание. Не каждый долетит до середины man bash, и уж точно не доплывёт.

> [sysrha@local ~]$ bash --version
> GNU bash, version 3.00.16(1)-release (i386-redhat-linux-gnu)
> ]] && echo NO || echo YES

(Тонко.)

$ read a; echo -n "$a - "; [[ "$a" =~ '^[0-9]+$' ]] && echo OOPS || echo NAYS
123
123 - NAYS
$ read a; echo -n "$a - "; [[ "$a" =~ '^[0-9]+$' ]] && echo OOPS || echo NAYS
qwer
qwer - NAYS
$ shopt compat31
compat31        off
$ shopt -s compat31
$ read a; echo -n "$a - "; [[ "$a" =~ '^[0-9]+$' ]] && echo OOPS || echo NAYS
123
123 - OOPS
$ read a; echo -n "$a - "; [[ "$a" =~ '^[0-9]+$' ]] && echo OOPS || echo NAYS
qwe
qwe - NAYS
$ bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ _


compat31
    If set, bash changes its behavior to that of version 3.1 with respect to  quoted  arguments  to
    the conditional command’s =~ operator.


"Оно! Нашёл."
Отправлено LSTemp , 19-Май-11 01:04 
>[оверквотинг удален]
> qwe - NAYS
> $ bash --version
> GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
> Copyright (C) 2007 Free Software Foundation, Inc.
> $ _
>
compat31 
>     If set, bash changes its behavior to that
> of version 3.1 with respect to  quoted  arguments  
> to
>     the conditional command’s =~ operator.

несомненно глубокий поклон, за всех птиц, "которые не долетели", но я же показывал:

[root@local localdomain]# bash -version
GNU bash, version 3.00.16(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

все в этом мире может быть. и не все сервера мы сами строим...


"Нужно проверить переменную, не число ли.?"
Отправлено pavlinux , 14-Май-11 02:02 
> А вот так работает...
> [[ "$1"  =~ ^[0-9]+$ ]];
>

pavel@suse64:/tmp> a=1;
pavel@suse64:/tmp> if [[ "$a"  =~ "^[0-9]+$" ]]; then echo Нумер; else echo Не нумер; fi;
Не нумер
pavel@suse64:/tmp> a=ЖОПА
pavel@suse64:/tmp> if [[ "$a"  =~ "^[0-9]+$" ]]; then echo Нумер; else echo Не нумер; fi;
Не нумер


---
[ $1 -ge 0 -o $1 -lt 0 ] && echo "Нумер" || echo "Не нумер"

pavel@suse64:/tmp> a=1;
pavel@suse64:/tmp> [ $a -ge 0 -o $a -lt 0 ] && echo "Нумер" || echo "Не нумер"
Нумер
pavel@suse64:/tmp> a=ЖОПА;
pavel@suse64:/tmp> [ $a -ge 0 -o $a -lt 0 ] && echo "Нумер" || echo "Не нумер"
bash: [: ЖОПА: integer expression expected
Не нумер



"Нужно проверить переменную, не число ли.?"
Отправлено LSTemp , 15-Май-11 02:15 
>[оверквотинг удален]
> || echo "Не нумер"
> pavel@suse64:/tmp> a=1;
> pavel@suse64:/tmp> [ $a -ge 0 -o $a -lt 0 ] && echo
> "Нумер" || echo "Не нумер"
> Нумер
> pavel@suse64:/tmp> a=ЖОПА;
> pavel@suse64:/tmp> [ $a -ge 0 -o $a -lt 0 ] && echo
> "Нумер" || echo "Не нумер"
> bash: [: ЖОПА: integer expression expected
> Не нумер

не мучайся - тебе же видимо для лабы надо (производительность побоку).

заменяй все НЕ_ЦИФРЫ на пустое место (shell, awk, sed, etc) и сравнивай результат с пустой строкой - все.

PS
все демагогия на счет "башизма" и перенорса относительна. и это совсем другой вопрос. как ты сказал - bash используешь - вот и не парься - решение дано (просто подходи в следующий раз к задаче не однобоко, и помни что иногда ее можно решить необычным путем).


"Нужно проверить переменную, не число ли.?"
Отправлено pavlinux , 16-Май-11 00:15 
>>[оверквотинг удален]
>> bash: [: ЖОПА: integer expression expected
>> Не нумер
> не мучайся - тебе же видимо для лабы надо (производительность побоку).

Думаешь мы для него стараемся, это мы тут писками меряемся :)


"Нужно проверить переменную, не число ли.?"
Отправлено universite , 16-Май-11 00:47 

> Думаешь мы для него стараемся, это мы тут писками меряемся :)

Может вам еще пару вопросиков подкинуть, чтоб вы там достоинствами мерялись?


"Нужно проверить переменную, не число ли.?"
Отправлено pavlinux , 16-Май-11 00:56 
>> Думаешь мы для него стараемся, это мы тут писками меряемся :)
> Может вам еще пару вопросиков подкинуть, чтоб вы там достоинствами мерялись?

Легко!


"Нужно проверить переменную, не число ли.?"
Отправлено universite , 16-Май-11 17:43 
>>> Думаешь мы для него стараемся, это мы тут писками меряемся :)
>> Может вам еще пару вопросиков подкинуть, чтоб вы там достоинствами мерялись?
> Легко!

http://www.opennet.me/openforum/vsluhforumID9/9133.html
http://www.opennet.me/openforum/vsluhforumID9/9132.html
http://www.opennet.me/openforum/vsluhforumID9/9131.html


"Нужно проверить переменную, не число ли.?"
Отправлено LSTemp , 17-Май-11 03:52 
>> Думаешь мы для него стараемся, это мы тут писками меряемся :)
> Может вам еще пару вопросиков подкинуть, чтоб вы там достоинствами мерялись?

а как на счет Вашего "достоинства"? Его мерять будем? Или Вы предпочитаете единолично бабло за решение абстрактно поставленных задач получать?



"Нужно проверить переменную, не число ли.?"
Отправлено universite , 17-Май-11 11:41 
>>> Думаешь мы для него стараемся, это мы тут писками меряемся :)
>> Может вам еще пару вопросиков подкинуть, чтоб вы там достоинствами мерялись?
> а как на счет Вашего "достоинства"? Его мерять будем?

Никогда не мерял, нет необходимости :)

> Или Вы предпочитаете единолично бабло за решение абстрактно поставленных задач получать?

Могу Вас заверить, что эти скрипты пишутся не "на заказ".

Если Вы ратуете за монетизацию советов, то обратитесь к владельцу ресурсу, чтоб добавил кнопочку напротив каждого ника: "Donate", с возможностью показывать финансовые контакты ника.