我试图测试变量$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
答案 0 :(得分:1)
替换:
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
语句的相应退出代码。
答案 1 :(得分:0)
重构代码以使用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 !(...)
。 Awk的处理模型要求您读取输入文件;我们提供/dev/null
,并将实际逻辑放在END
块中,以便即使没有输入也会执行。
这将检查是否存在多于一个小数点,但正则表达式当前不能处理指数表示法。考虑到John1024的答案中的正则表达式,添加对此的支持不应该太难。