0

如何在shell脚本中检查字符串是否包含数字/十进制格式的版本

例如,我们有 1.2.3.5 或 2.3.5

如果我们对这里的字符数没有限制怎么办。它也可以是 xxxx 或 xx。

4

4 回答 4

4

如果您使用bash,则可以使用=~正则表达式匹配二元运算符,例如:

pax> if [[ 1.x20.3 =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then echo yes ; fi

pax> if [[ 1.20.3 =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then echo yes ; fi
yes

对于您的特定测试数据,以下正则表达式可以解决问题:

^[0-9]+(\.[0-9]+)*$

(一个数字后跟任意数量的.<number>扩展)虽然,如果你想处理像1.2-rc7or之类的边缘情况4.5-special,你需要一些更复杂的东西。

于 2013-06-12T01:36:27.187 回答
2

使用bash 正则表达式

echo -n "Test: "
read i

if [[ $i =~ ^[0-9]+(\.[0-9]+){2,3}$ ]]; 
then
  echo Yes
fi

这接受digits.digits.digitsdigits.digits.digits.digits

更改{2,3}以缩小或放大可接受的数量.digits(或 {2,}“至少 2”)

  • ^表示字符串的开头
  • [0-9]+表示至少一位数
  • \.是一个点
  • (...){2,3}接受 2 或 3 个里面的东西()
  • $表示字符串结束
于 2013-06-12T01:40:02.733 回答
0

如果你真的受限于 Bourne shell,那么使用expr

if expr 1.2.3.4.5 : '^[0-9][.0-9]*[0-9]$' > /dev/null; then
  echo "yep, it's a version number"
fi

我确信有涉及 awk 或 sed 的解决方案,但这会做。

于 2013-06-12T02:52:33.627 回答
-2

翻转逻辑:检查它是否包含“无效”字符:

$ str=1.2.3.4.5; [[ $str == *[^0-9.]* ]] && echo nope || echo yup
yup
$ str=123x4.5;   [[ $str == *[^0-9.]* ]] && echo nope || echo yup
nope

这个答案的缺点:

$ str=123....; [[ $str == *[^0-9.]* ]] && echo nope || echo yup
yup
于 2013-06-12T01:41:10.973 回答