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]
不代表数字1000
到9999
,而是字符[1000-9999]
,范围0-9
,字符9
, 9
– 基本上所有的数字。 [1-85]
并不是指数字1
到85
,而是1
到8
和5
的数字……,它们只是从1
到8
的数字。 所以[1-20]*
表示以1
或0
开头的任何东西 – 所以即使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