bash无法用bc比较多个数字条件
bash unable to compare multiple number conditions with bc
已经尝试了几种不同的语法方法来对浮点数的数字范围进行 bash 测试,但无法使其正常工作。整数有效,没有 && 运算符的语句也是如此。我一定遗漏了一些明显的东西。
基本上70及以下是"ok",70.1到79.9之间是"warn",80及以上是"critical"
在此先感谢您的帮助或建议。
#! /bin/bash
number=70.1
echo $number
if (( $(echo "$number < 70" | bc -l) )); then echo "OK";fi
if (( $(echo "$number >= 70" && "$number < 80" | bc -l) )); then echo "WARN";fi
if (( $(echo "$number >= 80" | bc -l) )); then echo "CRITICAL";fi
echo "$number >= 70" && "$number < 80"
是bash中的两个命令。第一个是 echo
,第二个命令是“70.1 < 80
”(很确定您的系统上没有这样的命令)。
你可能想写 echo "$number >= 70 && $number < 80"
这只是一个命令。
顺便说一句:在 bash 中,您可以使用 bc <<< ...
而不是 echo ... | bc
。
if (( $(bc <<< "$number < 70") )); then echo "OK"; fi
if (( $(bc <<< "$number >= 70 && $number < 80") )); then echo "WARN"; fi
if (( $(bc <<< "$number >= 80") )); then echo "CRITICAL"; fi
或重组后的控制流
if (( $(bc <<< "$number < 70") )); then
echo "OK";
elif (( $(bc <<< "$number < 80") )); then
echo "WARN"
else
echo "CRITICAL"
fi
这应该是一个 awk
命令。
awk -v n="$number" 'BEGIN {
if (n < 70) { print "OK"; }
else if (n < 80) { print "WARN"; }
else { print "CRITICAL"; }
}'
由于比较范围是正整数¹,如果首先将$number
转换为整数,则shell可以在本地比较这些范围:
#!/usr/bin/env bash
# Defines the locale of our floating-point numbers
LC_NUMERIC=POSIX
number=70.1
echo $number
declare -i intnum
# Get decimal_point from locale (can be comma or anything locale specific)
dp="$(locale decimal_point)"
# Cut fractional part of floating-point number to a whole integer intnum
intnum="${number%$dp*}"
# Shell natively compares integer
if [ $intnum -lt 70 ]; then
echo 'OK';
elif [ $intnum -lt 80 ]; then
echo 'WARN'
else
echo 'CRITICAL'
fi
- 整数比较只适用于正数。
(-1.1 < -1
但 -1 = -1
)
已经尝试了几种不同的语法方法来对浮点数的数字范围进行 bash 测试,但无法使其正常工作。整数有效,没有 && 运算符的语句也是如此。我一定遗漏了一些明显的东西。
基本上70及以下是"ok",70.1到79.9之间是"warn",80及以上是"critical"
在此先感谢您的帮助或建议。
#! /bin/bash
number=70.1
echo $number
if (( $(echo "$number < 70" | bc -l) )); then echo "OK";fi
if (( $(echo "$number >= 70" && "$number < 80" | bc -l) )); then echo "WARN";fi
if (( $(echo "$number >= 80" | bc -l) )); then echo "CRITICAL";fi
echo "$number >= 70" && "$number < 80"
是bash中的两个命令。第一个是 echo
,第二个命令是“70.1 < 80
”(很确定您的系统上没有这样的命令)。
你可能想写 echo "$number >= 70 && $number < 80"
这只是一个命令。
顺便说一句:在 bash 中,您可以使用 bc <<< ...
而不是 echo ... | bc
。
if (( $(bc <<< "$number < 70") )); then echo "OK"; fi
if (( $(bc <<< "$number >= 70 && $number < 80") )); then echo "WARN"; fi
if (( $(bc <<< "$number >= 80") )); then echo "CRITICAL"; fi
或重组后的控制流
if (( $(bc <<< "$number < 70") )); then
echo "OK";
elif (( $(bc <<< "$number < 80") )); then
echo "WARN"
else
echo "CRITICAL"
fi
这应该是一个 awk
命令。
awk -v n="$number" 'BEGIN {
if (n < 70) { print "OK"; }
else if (n < 80) { print "WARN"; }
else { print "CRITICAL"; }
}'
由于比较范围是正整数¹,如果首先将$number
转换为整数,则shell可以在本地比较这些范围:
#!/usr/bin/env bash
# Defines the locale of our floating-point numbers
LC_NUMERIC=POSIX
number=70.1
echo $number
declare -i intnum
# Get decimal_point from locale (can be comma or anything locale specific)
dp="$(locale decimal_point)"
# Cut fractional part of floating-point number to a whole integer intnum
intnum="${number%$dp*}"
# Shell natively compares integer
if [ $intnum -lt 70 ]; then
echo 'OK';
elif [ $intnum -lt 80 ]; then
echo 'WARN'
else
echo 'CRITICAL'
fi
- 整数比较只适用于正数。
(-1.1 < -1
但-1 = -1
)