比较软件包的版本
优质
小牛编辑
136浏览
2023-12-01
软件包的版本号是个奇怪的东西。它们看起来像十进制的数字,但它们不是。 例如,一个版本号通常的形式为 2.6.4
。如果你需要比较两个版本号, 不能做简单的字符串比较,因为 2.6.4
会比 2.6.12
大;也不能进行数字比较, 因为它们不是有效地数字。
Puppet 的 versioncmp
函数会帮我们解决这个问题。 若你给它传递两个版本号,它会比较它们,并返回一个值,指出谁是更大的:
versioncmp( A, B )
将返回如下值:
若 A 和 B 相同,则返回 0
若 A 大于 B ,则返回大于 1 的值
若 A 小于 B ,则返回小于 0 的值
操作步骤
添加如下代码到你的配置清单:
$app_version = "1.2.2" $min_version = "1.2.10" if versioncmp( $app_version, $min_version ) >= 0 { notify { "Version OK": } } else { notify { "Upgrade needed": } }
运行 Puppet:
notice: Upgrade needed
现在更变
$app_version
的值:$app_version = "1.2.14"
在次运行 Puppet:
notice: Version OK
工作原理
我们指定了可接受的最小版本($min_version
)是 1.2.10。 所以在上面的例子中,我们用 $app_version
为 1.2.2 的版本号与之比较。
简单的对两个字符串进行比较(例如,Ruby 中的字符串比较)将会给出错误的结果, 然而 versioncmp
却可以正确地检测出 1.2.2
小于 1.2.10
并提示我们 Upgrade needed
。
当改变 $app_version
的值为 1.2.14
后,由于 versioncmp
正确地检测出 $app_version
大于 $min_version
,所以提示我们 Version OK
。