/bin/dash: проверьте, является ли 1$ числом

Одним предложением является Linux Mint - Это имеет большинство кодеков на живой ISO и LibreOffice - таким образом, необходимо смочь посмотреть видео, слушать аудио и прочитать документы и т.д.

12
25.04.2015, 00:55
7 ответов

Следующее обнаруживает целые числа, положительные или отрицательные, и работает под тире и является POSIX:

Вариант 1

echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"

Вариант 2

case "${1#[+-]}" in
    ''|*[!0-9]*)
        echo "Not an integer" ;;
    *)
        echo "Integer" ;;
esac

Или, с небольшим использованием команды : (nop):

! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
12
27.01.2020, 19:55

Попробуйте использовать его в качестве арифметического расширения, и посмотрите, работает ли он. На самом деле, нужно быть немного строже, потому что арифметические расширения будут игнорировать, например, лидирующие и трейлинговые пространства. Так сделайте арифметическое расширение и убедитесь, что развернутый результат точно совпадает с исходной переменной.

check_if_number()
{
    if [ "$1" = "$((${1}))" ] 2>/dev/null; then
        echo "Number!"
    else
        echo "not a number"
    fi
}

Это также примет отрицательные числа - если вы действительно хотите их исключить, добавьте дополнительную проверку для $((${1} >= 0)).

0
27.01.2020, 19:55

Вы можете использовать тест -EQ -EQ -EQ на строке, с собой:

$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi' 
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number

, если сообщение об ошибке является проблемой, вывод ошибки перенаправления на / Нуль :

$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no
1
27.01.2020, 19:55

В системе POSIX можно использовать expr:

$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer
0
27.01.2020, 19:55

Будь то , Bash , KSH ZSH , POSIX SH , или posh ( ( «Огренение раковины Борна» Sh ); Корпус конструкция является наиболее широко доступным и надежным:

case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
5
27.01.2020, 19:55

Возможно с Expr ? [1205366]?

if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then
  echo "integer"
else 
  echo "non-integer"
fi
0
27.01.2020, 19:55

Вот простая функция, использующая тот же метод, что и ответmuru :

IsInteger()      # usage: IsInteger string
{               #  returns: flag
        [ "$1" -eq "$1" ] 2> /dev/null
}

Пример:

p= n=2a3; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
p= n=23;  IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"

Выход:

'2a3' isn't an integer
'23' is an integer
0
27.01.2020, 19:55

Теги

Похожие вопросы