Как лучше всего проверить, является ли $ 1 целым числом в / bin / dash?
В bash я мог бы сделать:
[[ $1 =~ ^([0-9]+)$ ]]
Но это не похоже на POSIX-совместимость и Dash не поддерживает это
shell
regular-expression
string
dash
Мартин Вегтер
источник
источник
foo\n123\nbar
не целое число, но пройдет этот тест.Независимо от того
dash
,bash
,ksh
,zsh
, POSIXsh
, илиposh
( "переопределение Борна оболочки"sh
);case
конструкция является наиболее доступной и надежной:источник
dash
? Это работает для меня под,bash
но неdash
.dash
; чтобы опросить результат я добавилecho $?
после команды case.posh
(«переопределение оболочки Борна») также не имеет проблем с этим решением.case
; Одна из причин - это ошибка, которую вы описываете, другая - в редакторах, которые имеют функции, основанные на сопоставлении скобок (vim), они дают гораздо лучшую поддержку, и, что не менее важно, я считаю, что лично лучше, чтобы они соответствовали. - WRTposh
- это POSIX; ну, цитата из справочной страницы, которую я дал, предложила кое-что еще, но я не могу полагаться на такие неофициальные заявления в любом случае. Старая оболочка Bourne уже не так важна, как сейчас, в эпоху POSIX.Вы можете использовать
-eq
тест для строки с самим собой:Если сообщение об ошибке является проблемой, перенаправьте вывод ошибки на
/dev/null
:источник
" 023 "
это число. Обратите внимание, что он работает с дефисом, но не со всеми другими оболочками POSIX, так как поведение не определено, если операнды представляют собой целые числа после запятой. Например, с помощью ksh можно сказать, чтоSHLVL
или1+1
это число.Попробуйте использовать его как арифметическое расширение и посмотрите, работает ли оно. На самом деле, вам нужно быть немного строже, чем это, потому что арифметические расширения будут игнорировать, например, начальные и конечные пробелы. Сделайте арифметическое расширение и убедитесь, что расширенный результат точно соответствует исходной переменной.
Это также будет принимать отрицательные числа - если вы действительно хотите исключить их, добавьте дополнительную проверку для
$((${1} >= 0))
.источник
[[
$(( ... ))
? Если это так, мой ответ все еще должен быть материально правильным, мне просто нужно добавить дополнительные цитаты.check_if_number 1.2
и функция вернулась:dash: 3: arithmetic expression: expecting EOF: "1.2"
Возможно с
expr
?источник
match
ни\+
Было бы также сказать, 0 не число. Вы хотитеexpr "x$1" : 'x[0-9]\{1,\}$'
В системе POSIX вы можете использовать expr :
источник
expr
реализации скажут, что 9999999999999999999 не является целым числом. POSIX не дает никаких гарантий, что это будет работать. На практике, по крайней мере, в системе GNU будет сказано, что «длина» - это целое число.expr 9999999999999999999 + 0
дает мне статус на 3 выхода иexpr -12 + 0
иexpr length + 0
дать мне статус в 0 выездном с GNU выража (+ string
силами ,string
которые будут рассматриваться как строка с GNUexpr
.expr "$a" - 0
Будет работать лучше).-12
является допустимым целым числом и9999999999999999999
дал переполнение.Вот простая функция, использующая тот же метод, что и ответ muru :
Пример:
Выход:
источник