使用bash

时间:2018-01-28 21:45:08

标签: bash shell awk sed grep

我有一个文件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

3 个答案:

答案 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.21.8.1已经在单独的变量CurrVExpecV中,您可以执行以下类似操作:

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