2015-08-19 11 views

ответ

5
[[ $myvar =~ [^[:digit:]] ]] || echo All Digits 

Или, если вам нравится if-then форме:

if [[ $myvar =~ [^[:digit:]] ]] 
then 
    echo Has some nondigits 
else 
    echo all digits 
fi 

В прежние времена, мы использовали бы [0-9]. Такие формы не являются безопасными для Юникода. Современная замена без использования Юникода - [:digit:].

+0

'if [[$ MyVar = ~ [0-9]]]' это то же самое? – 3kstc

+1

1.) '$ MyVar = ~ [0-9]' проверяет хотя бы одну цифру в MyVar. Насколько я понимаю вашу цель, вы хотите узнать, есть ли это _all_ цифры. Отсюда моя перевернутая форма. 2.) '[0-9]' используется для работы. С помощью современного юникода вы не можете доверять ему. Поэтому я использовал '[: digit:]' – John1024

7

Здесь:

#!/bin/bash 
if [[ $1 =~ ^[0-9]+$ ]] 
then 
    echo "ok" 
else 
    echo "no" 
fi 

ok Он печатает, если первый аргумент содержит только цифры и no иначе. Вы могли бы назвать его: ./yourFileName.sh inputValue

2

Если вы хотели бы проверить на совместимом пути POSIX, вы можете использовать:

expr string : regex  ## returns length of string if both sides match 

или

expr match string regex ## behaves the same 

Например, чтобы проверить, если $myvar является все цифры:

[ $(expr "x$myvar" : "x[0-9]*$") -gt 0 ] && echo "all digits" 

Примечание:'x', предваряемый переменной и выражением для защиты от теста ошибки сброса пустой строки. Для использования возвращаемого тестом length не забудьте вычесть 1, который представляет 'x'.

В if-then-else форме, вот короткий скрипт, который проверяет первый аргумент сценария содержит ли все цифры:

#!/bin/sh 

len=$(expr "x$1" : "x[0-9]*$") ## test returns length if $1 all digits 
let len=len-1     ## subtract 1 to compensate for 'x' 

if [ $len -gt 0 ]; then   ## test if $len -gt 0 - if so, all digits 
    printf "\n '%s' : all digits, length: %d chars\n" "$1" $len 
else 
    printf "\n '%s' : containes characters other than [0-9]\n" "$1" 
fi 

Пример вывода тест

$ sh testdigits.sh 265891 

'265891' : all digits, length: 6 chars 

$ sh testdigits.sh 265891t 

'265891t' : contains characters other than [0-9] 

Баш регулярное выражение [[ $var =~ ^[0-9]+$ ]] Хорошо, я использую его, но это bashism (ограничен оболочкой bash). Если вы заинтересованы в переносимости, POSIX-тест будет работать в любой совместимой с POSIX оболочке.

Смежные вопросы