bash如果声明,是一个低于要求的版本?

时间:2013-04-15 07:11:20

标签: bash if-statement awk version

我正在将依赖项检查编写到程序中,并且我要求特定程序至少是特定版本。

这是我到目前为止所拥有的......

gtkdialog_v=`gtkdialog --version | sed -e "s| |\n|g" -e "/^$/d" | grep "[0-9]\."`
if [ "$gtkdialog_v" -lt "0.8.3" ]; then echo "gtkdialog must be version 0.8.3 or higher"; exit; fi

“ - lt”是问题,如果我插入“=”然后它按预期运行,如果我使用“<”它的错误与“-lt”

相同

我的错误

[: 0.8.3: integer expression expected

我在这里缺少什么?

3 个答案:

答案 0 :(得分:2)

您可以使用Natural Sort执行此操作:

#!/bin/sh
min=0.8.3
ver=0.8.2

if shuf -e $min{,} $ver | sort -V | awk '{getline b;exit$0==b?0:1}'
then
  echo 'good'
else
  echo 'gtkdialog must be version 0.8.3 or higher'
  exit
fi

答案 1 :(得分:1)

-lt只能应用于整数表达式。但是你用它来比较字符串表达式。 bash不支持浮点运算。

而是比较字符串:

if [[ "$gtkdialog_v" < "0.8.3" ]];

注意这将进行ASCII比较(不是整数比较)。例如,

if [[ "0.12.3" < "0.8.3" ]]; then
  echo yes
fi

将打印“是”,这不是预期的。

答案 2 :(得分:0)

-lt期望一个整数表达式,而不是包含浮点格式值的字符串。所以它错了。我认为您可以稍微调整一下并删除.以便0.8.3成为083,然后您可以查看0.8.5 => 085。但是,如果版本seq是直接的,这将有效。或者另一种方法是切割它们并开始比较每个字段