2017-02-01 67 views
0
price="1.11" 
case $price in 
      ''|*[!0-9]*) echo "It is not an integer."; 
      ;; 
     esac 

Output: It is not an integerbash只允许带小数点的正整数或正整数

上述代码只能验证正整数。

如何允许带小数点的正整数?已通过互联网搜索无果

+0

的'!'实际上意味着它是*不*的整数。 – chepner

+0

可能复制http://stackoverflow.com/questions/41970586/regex-start-of-string-anchor-not-working –

+1

的当你说“带小数点的整数”,你的意思是后面可以跟一个完整的整数停止,还是你的意思是“浮点数”? – tripleee

回答

1

在POSIX兼容的方式这样做是棘手的;您当前的模式匹配-整数。两个bash扩展使这相当容易:

  1. 使用扩展模式

    shopt -s extglob 
    case $price in 
        # +([0-9]) - match one or more integer digits 
        # ?(.+([0-9])) - match an optional dot followed by zero or more digits 
        +([0-9]))?(.*([0-9]))) echo "It is an integer" ;; 
        *) echo "Not an integer" 
    esac 
    
  2. 使用正则表达式

    if [[ $price =~ ^[0-9]+(.?[0-9]*)$ ]]; then 
        echo "It is an integer" 
    else 
        echo "Not an integer" 
    fi 
    

(从理论上讲,你应该能够使用POSIX命令expr也进行正则表达式匹配;我有麻烦开始它可以工作,并且您没有将POSIX兼容性指定为需求,所以我不会担心它。 POSIX模式匹配是没有强大到足以匹配的数字任意长字符串)


如果你只想匹配“十进制化”的整数,而不是任意的浮点值,它当然是简单的:

  1. 延长图案+([0-9])?(.)
  2. 正则表达式[0-9]+\.?
+0

你似乎在检查小数点后的数字可选,当然,这并不造就数的整数。 – tripleee

+0

我过分解读这个问题似乎只有匹配,例如'6'除了'6'? – chepner

+0

谢谢。但是,如何检查数字是否为正值?如果[[$ price =〜[ 0-9] + \。?]] && [[$ price -lt 0]]。但失败:( – Justpee

-1

试试这个正则表达式^(0*[1-9][0-9]*(\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$

+1

您是否在'bash''case'语句的上下文中测试了这个? – shellter

+0

谢谢..但它似乎有附近意外的标记一些语法错误'(” – Justpee