我有一个文件file1
,如下所示,包含当前版本和预期版本号:
CurrV:1.5.2
ExpecV:1.8.1
我想编写一个bash脚本来比较这两个值,如果ExpecV>=CurrV
,则应该echo SUCCESS
,否则应该echo FAILURE
。
到目前为止,我已经写了这件事,但不确定如何进行:
#!/bin/bash
## Code already written to fetch `ExpecV` and `CurrV` from `file1`
echo $ExpecV | grep $CurrV > /dev/null
if [ $? -eq 0 ]
then
echo SUCCESS
else
echo FAILURE
fi
4条答案
按热度按时间fgw7neuy1#
你可以试试
vxqlmq5t2#
这个问题说
ExpecV>=CurrV
应该被视为成功,但这没有多大意义(当前版本比预期版本旧,可能会破坏一些东西),在您对此答案的评论中,您暗示了所需的行为是相反的,所以这就是此答案所做的。这需要为
-V
选项进行GNU排序(版本排序):这要求带有
CurrV
的行始终是第一行,它提取带有cut
的冒号之后的部分,并将未排序的(第一个进程替换<(...)
)与版本排序的输出(第二个进程替换)进行比较。如果相同,即第二行版本大于等于第一行版本,则
cmp
退出成功,打印FAILURE
;如果它们不相同,这意味着sort
颠倒了顺序,并且预期版本小于当前版本,因此我们打印SUCCESS
。-s
标志用于抑制cmp
的输出(“静默”);我们只关心退出状态。如果
1.5.2
和1.8.1
已经位于单独的变量CurrV
和ExpecV
中,则可以执行类似的操作,如下所示:这将两个变量存储到
versions
中,用换行符分隔,然后比较未排序的序列和排序的序列。k3bvogb13#
@benjamin-w和@Walter A的答案都非常简洁,我们也可以使用for循环逐个比较子版本的数值,如下所示:
g52tjvyc4#
如果您使用的是Debian系统,那么使用
dpkg
是最简单的:它支持所有六个比较运算符(参见
man dpkg
和在compare-versions
上搜索)。一个潜在的缺点:你的版本必须与Debian兼容。