Bash 脚本:测试浮点数是否在一定范围内,包括负数
Bash script: testing if floating point number is in a certain range including negative numbers
我正在尝试测试变量 $test
是否在 -0.9
和 0.9
之间。以下代码适用于数字,但如果 $test
是小写字母,则表示它是 -0.9
和 0.9
之间的数字。
是否有更好的方法可以让字母不在范围内?
test=a
if (( $( echo "$test >= -0.9" |bc -l) )) && (( $(echo "$test <= 0.9" |bc -l) )); then
echo "${test} is between -0.9 and 0.9"
else
echo "${test} is NOT between -0.9 and 0.9"
fi
替换:
if (( $( echo "$test >= -0.9" |bc -l) )) && (( $(echo "$test <= 0.9" |bc -l) )); then
使用(假设是 GNU 或其他增强型 bc):
if [[ "$test" =~ ^[[:digit:].e+-]+$ ]] && echo "$test>-0.9 && $test <=0.9" |bc -l | grep -q 1; then
工作原理
[[ "$test" =~ ^[[:digit:].e+-]+$ ]]
这会检查 $test
是否只包含合法的数字字符。
&&
仅当 $test
通过数字检查时,才继续进行 bc 测试。
echo "$test>-0.9 && $test <=0.9" |bc -l | grep -q 1
这将验证 $test
在您想要的范围内。 grep -q 1
为要使用的 if
语句设置适当的退出代码。
重构代码以使用 Awk 可能更有效,尽管它需要了解一些关于 shell 的晦涩的事情。
if awk -v number="$test" 'END { exit !( \
number !~ /[^0-9.]/ && number !~ /\..*\./ && \
number >= -0.9 && number <= 0.9) }' /dev/null
then
echo "$test is between -0.9 and 0.9"
else
echo "$test is NOT between -0.9 and 0.9"
fi
if
检查的exit code为0则为真,与括号内的真值相反;因此 exit !(...)
。 Awk 的处理模型要求您读取输入文件;我们提供 /dev/null
,并将实际逻辑放在 END
块中,这样即使没有输入也能执行。
这会检查小数点不会超过一位,但正则表达式目前无法处理指数表示法。鉴于 John1024 的回答中的正则表达式,添加对此的支持应该不会太难。
我正在尝试测试变量 $test
是否在 -0.9
和 0.9
之间。以下代码适用于数字,但如果 $test
是小写字母,则表示它是 -0.9
和 0.9
之间的数字。
是否有更好的方法可以让字母不在范围内?
test=a
if (( $( echo "$test >= -0.9" |bc -l) )) && (( $(echo "$test <= 0.9" |bc -l) )); then
echo "${test} is between -0.9 and 0.9"
else
echo "${test} is NOT between -0.9 and 0.9"
fi
替换:
if (( $( echo "$test >= -0.9" |bc -l) )) && (( $(echo "$test <= 0.9" |bc -l) )); then
使用(假设是 GNU 或其他增强型 bc):
if [[ "$test" =~ ^[[:digit:].e+-]+$ ]] && echo "$test>-0.9 && $test <=0.9" |bc -l | grep -q 1; then
工作原理
[[ "$test" =~ ^[[:digit:].e+-]+$ ]]
这会检查
$test
是否只包含合法的数字字符。&&
仅当
$test
通过数字检查时,才继续进行 bc 测试。echo "$test>-0.9 && $test <=0.9" |bc -l | grep -q 1
这将验证
$test
在您想要的范围内。grep -q 1
为要使用的if
语句设置适当的退出代码。
重构代码以使用 Awk 可能更有效,尽管它需要了解一些关于 shell 的晦涩的事情。
if awk -v number="$test" 'END { exit !( \
number !~ /[^0-9.]/ && number !~ /\..*\./ && \
number >= -0.9 && number <= 0.9) }' /dev/null
then
echo "$test is between -0.9 and 0.9"
else
echo "$test is NOT between -0.9 and 0.9"
fi
if
检查的exit code为0则为真,与括号内的真值相反;因此 exit !(...)
。 Awk 的处理模型要求您读取输入文件;我们提供 /dev/null
,并将实际逻辑放在 END
块中,这样即使没有输入也能执行。
这会检查小数点不会超过一位,但正则表达式目前无法处理指数表示法。鉴于 John1024 的回答中的正则表达式,添加对此的支持应该不会太难。