我有一个文件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
答案 0 :(得分:2)
问题是ExpecV>=CurrV
应该被视为成功,但这没有多大意义(当前版本比预期的版本可能会破坏某些东西)并且在您对此答案的评论中提到了所需的行为反过来,所以这就是答案。
这需要对其-V
选项(version sort)进行GNU排序:
if cmp -s <(cut -d: -f2 infile) <(cut -d: -f2 infile | sort -V); then
echo 'FAILURE'
else
echo 'SUCCESS'
fi
这要求CurrV
的行始终是第一行。它使用cut
在冒号后提取部分,并将未排序(第一个进程替换<(...)
)与版本排序的输出(第二个进程替换)进行比较。
如果它们相同,即第二行的版本大于或等于第一行的版本,cmp
的退出状态成功,我们打印FAILURE
;如果它们不相同,则表示sort
颠倒了订单,预期版本小于当前版本,因此我们打印SUCCESS
。
-s
标志用于禁止cmp
(“无声”)的输出;我们只对退出状态感兴趣。
如果1.5.2
和1.8.1
已经在单独的变量CurrV
和ExpecV
中,您可以执行以下类似操作:
CurrV='1.5.2'
ExpecV='1.8.1'
printf -v versions '%s\n%s' "$CurrV" "$ExpecV"
if [[ $versions = "$(sort -V <<< "$versions")" ]]; then
echo 'FAILURE'
else
echo 'SUCCESS'
fi
这将两个变量存储到versions
中,用换行符分隔,然后将未排序的变量与排序的序列进行比较。
答案 1 :(得分:1)
你可以尝试
if [ $(echo "${CurrV}\n${ExpecV}"|sort|head -1) != "${CurrV}" ]; then ...
答案 2 :(得分:0)
@benjamin-w 和@Walter A 的回答都非常简洁。我们还可以使用 for 循环按子版本数值比较子版本,如下所示:
Casio AA_12_Test_A3_rr1
Casio AA_12_Test_A3_rr2
Casio AA_12_Test_A4_rr1
Casio AA_12_Test_A4_rr2
Casio AA_12_Test_A4_rr3
Casio AA_12_Test_B5_lng_rr1
Casio AA_12_Test_B5_lng_rr2
Casio AA_12_Test_B5_sht_rr1
Casio AA_12_Test_B5_sht_rr2
Casio AA_12_Test_E4_sht_rr1
Casio AA_12_Test_E4_sht_rr2
Casio AA_12_Test_E5_sht_rr1
Casio AA_12_Test_E5_sht_rr2
Casio AA_12_Test_F5_lng_rr1
Casio AA_12_Test_G4_lng_rr1