Стек выскакивает сообщение, спрашивающее меня, действительно ли я хочу ответить после 30+ ответов? Но конечно!!!
Используйте новые функции bash, и вот оно: (после комментария я внес изменение)
function isInt () {([[$ 1 -eq $ (($ 1 + 0))]] 2> / dev / null &&
[[$ 1! = '']] && echo 1) || echo ''}
function isInt() {
([[ $1 =~ ^[-+0-9]+$ ]] && [[ $1 -eq $(( $1 + 0 )) ]] 2>/dev/null && [[ $1 != '' ]] && echo 1) || echo ''
}
Поддержка:
===============out-of-the-box==================
1. negative integers (true & arithmetic),
2. positive integers (true & arithmetic),
3. with quotation (true & arithmetic),
4. without quotation (true & arithmetic),
5. all of the above with mixed signs(!!!) (true & arithmetic),
6. empty string (false & arithmetic),
7. no value (false & arithmetic),
8. alphanumeric (false & no arithmetic),
9. mixed only signs (false & no arithmetic),
================problematic====================
10. positive/negative floats with 1 decimal (true & NO arithmetic),
11. positive/negative floats with 2 or more decimals (FALSE & NO arithmetic).
True / false - это то, что вы получаете от функции только при использовании в сочетании с подстановкой процесса, как в [[ $( isInt <arg> ) ]]
, так как в bash нет логического типа и не return значение функции.
Я использую заглавные буквы, когда результат тестового выражения НЕПРАВИЛЬЕН, тогда как он должен быть обратным!
Под «арифметикой» я имею в виду bash может выполнять математические операции, как в следующем выражении: $x=$(( $y + 34))
.
Я использую «арифметику / отсутствие арифметики», когда в математических выражениях аргумент действует так, как ожидается, и «НЕТ арифметики», когда он ведет себя не так, как ожидалось.
Как видите, только 10 и 11 не являются проблемными!
Отлично!
PS: Обратите внимание, что MOST популярный ответ не удается в случае 9!