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