在 shell 脚本中比较字符串和数字



我正在尝试比较构建数字和回声哪个更大。这是我写的剧本

    New_Cycle_Num='c4.10'
    Old_Cycle_Num='c4.9'
    if  [ "$New_Cycle_Num" == "$Old_Cycle_Num" ];
    then echo 'both are equal'
    elif [ "$New_Cycle_Num" "<" "$Old_Cycle_Num" ]];
    then echo 'New_Cycle_Num is less than Old_Cycle_Num'
    else echo 'New_Cycle_Num is greater than Old_Cycle_Num'
    fi

我的脚本给我的输出是"New_Cycle_Num小于 Old_Cycle_Num"而不是最后一个语句。 为什么 C4.10 与小于 C4.9 相比? 有什么帮助来纠正这个问题吗?非常感谢!!

你会得到你得到的结果,因为通过词法比较,比较第 4 个字符,"1"出现在字典中的"9"之前(在相同的意义上,"foobar"会出现在"食物"之前,即使"foobar"更长)。

lssort这样的工具有一个"版本排序"选项,这在这里很有用,尽管有些尴尬:

New_Cycle_Num='c4.10'
Old_Cycle_Num='c4.9'
if [[ $New_Cycle_Num == $Old_Cycle_Num ]]; then
    echo 'equal'
else
    before=$(printf "%sn" "$New_Cycle_Num" "$Old_Cycle_Num")
    sorted=$(sort -V <<<"$before")
    if [[ $before == $sorted ]]; then
        echo 'New_Cycle_Num is less than Old_Cycle_Num'
    else
        echo 'New_Cycle_Num is greater than Old_Cycle_Num'
    fi
fi
New_Cycle_Num is greater than Old_Cycle_Num

我想不出一个很好的选择。可能有

echo -e "c4.10nc4.9" | 
perl -MSort::Versions -E '
  $a=<>; $b=<>; chomp($a, $b); $c=versioncmp($a,$b);
  say "$a is ". ($c==0 ? "equal to" : $c < 0 ? "less than" : "greater than") . " $b"
'
c4.10 is greater than c4.9

但是您必须从CPAN安装Sort::Versions。

相关内容

  • 没有找到相关文章

最新更新