LINUX.ORG.RU

Как в bash отличить число от строки?

 , ,


0

3

Есть некий скрипт, который принимает два параметра: <число> <строка>. В нем проверяется только наличие двух параметров и громкая ругань, если их меньше двух.

Не могу только отловить ситуацию, когда вместо первого параметра не ожидаемое число, а неведомая хрень.

ABS по диагонали просмотрел, но ничего подобного не нашел. Возможно, что плохо искал.

★★★★★

Последнее исправление: Radjah (всего исправлений: 1)

На баше такого говна поешь на каждом шагу. Бери любой более нормальный яп.

anonymous
()

число это строка состоящая из определеного, узкого набора символов. проверяй

anonymous
()
if ! [[ $1 =~ ^-?[0-9]+$ ]]; then
    echo >&2 "Мр-бр-бр"
    exit 1
fi
anonymous
()

Много разных костылей можно придумать. Например

printf '%d' ${1} >/dev/null 2>&1
#или %f если не целое
if [$? -eq 0]; then
    echo 'число'
    #…
fi

liaonau
()

Никак, лол. Выбрось баш.

nikolnik ★★★
()

google://stackoverflow bash is number

anonymous
()

Для начала определитесь с тем, что вы называете «числом». Если «число» — это число, понимаемое ГНУ Башем, то есть целое положительное (возможно, с ведущим плюсом) или отрицательное, то это один из редких случаев, когда бывают полезны устаревшие одиночные квадратные скобочки.

[ "$i" -eq "$i" ] 2>&- || err "‘$i’ is not an integer"

Если что-то иное, то что-то иное.

P. S. err — это какая-то ваша функция обработки ошибок, разумеется. В простейшем случае:

err() {
    printf >&2 '%s\n' "$*"
    exit 1
}
Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от anonymous

anonymous> Бери любой более нормальный яп.
nikolnik> Никак, лол. Выбрось баш.

Ой-ой. И как у нас это делается на «более нормальных ЯП»? На Перле, к примеру? Или его тоже выбросить?

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от liaonau

Мало того, что у вас две синтаксических ошибки в третьей строке — ладно, опечатались. Но надо же пояснять, какое понимание «числа» здесь заложено, а оно очень широкое.

Вы думаете, то, что дальше у т-ща Radjah по сценарию легко поймет числа 052, 0x2A и '*?

$ printf '%d\n' "052" "0x2A" "'*"
42
42
42
Zmicier ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Просто замечательное число, я же это и пишу.

Другой вопрос — что является валидным вводом с точки зрения логики программы; скорее всего, нечто иное.

Посему я и первым же делом и спросил ОПа, что он называет числом. И когда и если он это конкретизирует, то вполне вероятно окажется, что заявление вида «выкинь Баш, возьми более нормальный ЯП» в данном случае высосано из пальца.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Целое без знака. Разрядов до 10 где-то.

В принципе скрипт в разнос пойти не должен, но очень желательно проверять, чтобы порожняк не гонять.

Radjah ★★★★★
() автор топика
Последнее исправление: Radjah (всего исправлений: 1)

очень просто, <zen>чисел нет</zen>

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

На баше такого говна поешь на каждом шагу. Бери любой более нормальный яп.

И в каком же ЯП для аргументов командной строки производится автоматическое определение типа данных? :) Чо-то как-то не припомню такого языка, у всех ЯП аргументы в виде строк в программу попадают, и во всех придётся самостоятельно эти строки проверять на предмет типа данных. Причём на баше как раз это делается относительно просто, благодаря =~ например.

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

Это потому что в баше функции вызываются со строковыми аргументами командной строки, и прочее порно.

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

С каких пор != в [[ стал матчить паттерны?

Если мы о ГНУ Баше — лень искать, сами найдите. Если вообще, то, наверное, с 1988-го (шелл Корна), там правда, по-моему, не было отрицания группы символов циркумфлексом, но это другой вопрос. А может быть, я все путаю.

Первый раз слышу.

О сколько нам открытий чудных готовит просвещенья дух.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от Radjah

А при чем здесь вообще Coreutils?

$ type [[
[[ is a shell keyword
Zmicier ★★★★★
()
Ответ на: комментарий от anonymous

Это потому что в баше функции вызываются со строковыми аргументами командной строки, и прочее порно.

Какие тут нахер функции? Где у ТС хоть слово про функции?

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

У ОПа стоит тег bash, в заголовке «Как в bash отличить число от строки». Ты идиот? Да, ты идиот.

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

У ОПа стоит тег bash, в заголовке «Как в bash отличить число от строки». Ты идиот? Да, ты идиот.

Идиот здесь тот, кто в этом всём какие-то функции нашёл. Функциональщина головного мозга?

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

Рано или поздно в любом более-менее сложном скрипе у опа они появятся.

Да-да, а ещё у бабушки вырастет хер и она станет дедушкой.

Интересно, вам чо, платят что-ли за пропаганду/контрпропаганду всяческих язычков, поэтому прям приходится выдавливать из себя полнейшую хероту в качестве аргументов, лишь бы чего написать?

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

А, так ты ещё и любитель теорий заговора, тогда всё понятно.

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