bash中case语句中的条件和范围

我正在为Nagios编写一个插件来检查安全包的数量,并在这里做一个case语句。

但整件事情最终变成了怪异的表演。 我基本上想做的就是说,如果有1-20个套餐显示此警告,如果21无限显示关键等等,但我不能只做[ -gt 1 ]甚至[20-10000]

当应用这些范围时,脚本会不规则地运行,并且当它意味着关键等时发出警告。我想我收集的范围在这里实际上是不可能的,我只是想知道为什么它适用于上面给出的例子而不是我。 此外,是否有可能在案件中包含条件?

最后,我设法完成了一个完全有效的脚本,但我必须创建if条件并将它们传递给case。 只是想知道是否有更简单的方法来做到这一点,而不必这样做。

以下是我试图做的或多或少。 最后一部分是我正在绝望地尝试不同范围的负载以确定它是否有效。

 case $SECURITY_PACKAGES in 0) echo "OK - not bad: There are a total of $TOTAL_PACKAGES packages to upgrade in this server, but none of them are security updates!" exit 0 ;; [1-20]*) echo "WARNING - $TOTAL_PACKAGES packages required to upgrade in this server, of which $SECURITY_PACKAGES are security updates" exit 1 ;; [21-99]|[100-999]|[1000-9999]*) echo "CRITICAL - $SECURITY_PACKAGES out of $TOTAL_PACKAGES are security updates! Consider upgrading soon!" exit 2 ;; *) echo "UNKNOWN - I am not sure what's happening now, check later or check server: $TOTAL_PACKAGES to upgrade, $SECURITY_PACKAGES are security updates" exit 3 ;; esac 

您无法在case表达式中轻松表达数字范围 – 例如,模式[1000-9999] 不代表数字10009999 ,而是字符[1000-9999] ,范围0-9 ,字符99 – 基本上所有的数字。 [1-85]并不是指数字185 ,而是185的数字……,它们只是从18的数字。 所以[1-20]*表示以10开头的任何东西 – 所以即使20000000也会匹配。 使用if / then / elif / else / fi代替:

 if (( $SECURITY_PACKAGES == 0 )) then echo "OK - not bad: There are a total of $TOTAL_PACKAGES packages to upgrade in this server, but none of them are security updates!" exit 0 elif (( $SECURITY_PACKAGES <= 20 )) then echo "WARNING - $TOTAL_PACKAGES packages required to upgrade in this server, of which $SECURITY_PACKAGES are security updates" exit 1 elif (( $SECURITY_PACKAGES <= 9999 )) then echo "CRITICAL - $SECURITY_PACKAGES out of $TOTAL_PACKAGES are security updates! Consider upgrading soon!" exit 2 else echo "UNKNOWN - I am not sure what's happening now, check later or check server: $TOTAL_PACKAGES to upgrade, $SECURITY_PACKAGES are security updates" exit 3 fi