как проверить, является ли ввод число или алфавит в седе - PullRequest
0 голосов
/ 13 апреля 2020

Я проверяю, является ли пользовательский ввод числовым или содержит алфавитные символы. Я использую приведенный ниже код, чтобы проверить его, но он не работает должным образом: он всегда дает мне целое или не целое число. Пожалуйста, помогите мне.

    echo "Enter version code" 
    read VERSIONCODE
    test -z $(echo "VERSIONCODE" | sed s/[[:digit:]]//g) && echo "integer" || echo "no integer"
    echo "$VERSIONCODE"
    sudo  sed "s/\(versionCode[[:space:]]*\)[0-9]*/\1${VERSIONCODE}/" Version.gradle

Это мой вывод

Enter version code
1

no integer

Я неожиданно для этого

echo "Enter version code" 
read versionCode

if ! [[ "$versionCode" =~ ^[:digit:]+$ ]]
  then
    echo "Sorry integers only"
fi
echo "$versionCode"
sudo  sed "s/\(versionCode[[:space:]]*\)[0-9]*/\1${versionCode}/" Version.gradle 

Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

Это может работать для вас (GNU sed):

<<<"$versionCode" sed -n '/^[[:digit:]]\+$/!q1' && echo OK || echo NOK

Если $ versionCode не является числом c, установите код выхода 1.

Или, возможно, вы хотите по умолчанию:

<<<"$versionCode" sed '/^[[:digit:]]\+$/!s/.*/Default version/'
0 голосов
/ 13 апреля 2020

Вы всегда можете проверить только цепочки из [0-9], чтобы проверить целое число:

$ echo 17 | sed -n '/^[0-9][0-9]*$/p'
17
$ echo 17.12 | sed -n '/^[0-9][0-9]*$/p'
$

, но в целом при проверке чисел в других контекстах не пытайтесь использовать регулярное выражение (и так не пытайтесь использовать sed, grep, et c.), используйте вместо этого awk:

$ echo 17 | awk '{print $0, "is " ($0==($0+0) ? "" : "NOT ") "a number"}'
17 is a number

$ echo 17.12 | awk '{print $0, "is " ($0==($0+0) ? "" : "NOT ") "a number"}'
17.12 is a number

$ echo 17.12.53 | awk '{print $0, "is " ($0==($0+0) ? "" : "NOT ") "a number"}'
17.12.53 is NOT a number

$ echo 003 | awk '{print $0, "is " ($0==($0+0) ? "" : "NOT ") "a number"}'
003 is a number

$ echo 2e7 | awk '{print $0, "is " ($0==($0+0) ? "" : "NOT ") "a number"}'
2e7 is a number

$ echo 2f7 | awk '{print $0, "is " ($0==($0+0) ? "" : "NOT ") "a number"}'
2f7 is NOT a number
0 голосов
/ 13 апреля 2020

Замените [:digit:] на [0-9] в своем регулярном выражении:

#!/bin/bash
echo "Enter version code" 
read versionCode

if ! [[ "$versionCode" =~ ^[0-9]+$ ]]; then
  echo "Sorry integers only"
fi
echo "$versionCode"

Это работает для теста if. При необходимости измените последнюю строку вашего кода.

...