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 = -1)