Bash RegEx 用于检查用户输入中的浮点数



我对bash编程相对较新,我目前正在创建一个简单的计算器。

它需要使用浮点数并检查它们是否如此。

我有一个校验数字功能:

function checkNumber {
regExp=[0-9]
if [ $testNo =~ $regExp ]
then
echo "That is a number!"
let check=1
else
echo "Damn! Not A Number!"
fi
}

我让用户输入这样的数字:

while [ $check -eq 0]
do
echo "Please enter a number
read testNo
echo ""
checkNumber
done

这不起作用,我收到此错误:

./calculator.sh:第 39 行:[: =~:预期的二进制运算符

第 39 行是:

if [ $testNo =~ $regExp ] 

我尝试了很多正则表达式,例如:

^*[0-9]*$

^*[0-9].[0.9]*$

等等等等。

另外,我还绑定了执行检查的其他方法:

case $testNo
in
^*[0-9]*$) echo "That is a number!";;
*) echo "Error! Not a number!";;
esac

if [ $testNo = ^*[0-9]*$ ]
then
echo "etc etc"
else
echo "oops"
fi

我还需要它来处理浮点数。

有人可以告诉我我是怎么做的吗?

此正则表达式^[-+]?[0-9]+.?[0-9]*$将仅匹配带有可选.的数字:

$ echo 30 | grep -Eq '^[-+]?[0-9]+.?[0-9]*$' && echo Match
Match
$ echo 30.10 | grep -Eq '^[-+]?[0-9]+.?[0-9]*$' && echo Match
Match
$ echo 30. | grep -Eq '^[-+]?[0-9]+.?[0-9]*$' && echo Match
Match
$ echo +30 | grep -Eq '^[-+]?[0-9]+.?[0-9]*$' && echo Match
Match
$ echo -30 | grep -Eq '^[-+]?[0-9]+.?[0-9]*$' && echo Match
Match

我想当你尝试^*[0-9]你想要^[0-9]*

刨花:

^       # Match start of string
[-+]?   # Match a leading + or - (optional)
[0-9]+  # Match one or more digit
.?     # Match a literal . (optional, escaped)
[0-9]*  # Match zero or more digits
$       # Match the end of the string

注意:这匹配数字后跟.,如30.,不确定这是否适合您。

编辑:不要引用regex

testNo=30.00
if [[ $testNo =~ ^[+-]?[0-9]+.?[0-9]*$ ]]; then 
echo Match
fi
>>> Match

若要使用该类型的功能,需要条件的[[ ... ]]版本。[是"旧"test命令,根本不处理正则表达式。

#! /bin/bash
function checkNumber {
regExp='^[+-]?([0-9]+.?|[0-9]*.[0-9]+)$'
if [[ $testNo =~ $regExp ]]
then
echo "That is a number!"
let check=1
else
echo "Damn! Not A Number!"
fi
}
testNo=1
checkNumber
testNo=-1.2
checkNumber
testNo=+.2
checkNumber
testNo=+0.
checkNumber
testNo=a
checkNumber
testNo=hello2you
checkNumber
$ ./t.sh
That is a number!
That is a number!
That is a number!
That is a number!
Damn! Not A Number!
Damn! Not A Number!

请参阅测试、[ 和 [[ ?] 之间的区别是什么。

关于正则表达式的解释:

^ Anchor at start of string
$ Anchor at end of string

这两个使正则表达式匹配传递的整个字符串,不允许部分匹配。

[+-]

匹配+-

[+-]?

使该部分可选,因此上述内容完全匹配+-或根本没有匹配。

然后有一个交替(part1|part2)如果part1part2匹配,它将匹配。

第一部分是:

[0-9]+.?

匹配一个或多个(+)位数字(但不是零位/空集)和一个可选的.。这将处理形式123534.的数字。但不仅仅是..

第二部分是:

[0-9]*.[0-9]+

这匹配零个或多个(*)位数字,后跟一个.,后跟一个或多个数字。这匹配所有其他浮点数,如1.3.543(没有指数表示法),但仍排除.

#!/bin/bash
#script to validate 
while [ true ]; do
clear
echo "Introduce the numeric value: "
read -r var
if [[ $var =~ ^[+-]?([0-9]+)$ ]]
then
echo "You introduced an integer value (without decimals)"
read
else
if [[ $var =~ ^[+-]?([0-9]+.)$ ]]
then
echo "Incomplete floating value (no values provided at the right of the point)"
read
else
if [[ $var =~ ^[+-]?(.[0-9]+)$ ]]
then
echo "Incomplete floating value (no values provided at the left of the point)"
read
else
if [[ $var =~ ^[+-]?([0-9]+.[0-9]+)$ ]]
then
echo "You introduced a correct floating value"
read
else
echo "You introduced something other than a valid numeric value"
read
fi
fi
fi
fi
done

我在开头包含一个可选的点。

user@debian:~$ testNo=.01
user@debian:~$ if [[ $testNo =~ ^[+-]?[.]?[0-9]+.?[0-9]*$ ]]; 
> then         
> echo Match; 
> fi
Match

相关内容

  • 没有找到相关文章

最新更新