2013-04-15 18 views
2

我正在編寫依賴項檢查程序,並且我需要一個特定的程序至少是一個特定的版本。bash if語句是否小於所需的版本?

這是我迄今爲止..

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 

缺少什麼我在這裏?

+0

較新版本的GNU'coreutils'提供'sort'。 – devnull

回答

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 
+0

適用於任何我能想到的測試情況。謝謝 – user2225483

1

-lt只能應用於整數表達式。但是您正在使用它來比較字符串表達式。 bash不支持浮點運算。

而是比較字符串:

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

注意這會做ASCII比較(不整數比較)。例如,

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

將打印「是」,這不是預期的。

+0

'<'不適用於'[',它被解析爲文件重定向。 –

+1

第二個例子在我的情況下工作(現在),因爲0.8.x是這個程序的最高版本,但如果開發人員在1.0.0之前轉到0.10.0,它將無法工作,任何更好的修復將不勝感激。 – user2225483

+1

@ user2225483您可以使用awk:'echo 0.12 0.13 | awk'{if($ 1> $ 2){print $ 1} else {print $ 2}}''傳遞這些字符串並進行比較。 –

0

-lt預期整數表達式,而不是包含浮點格式值的字符串。所以它錯了。我認爲你可以調整一下,並刪除.因此0.8.3變成083,然後你可以檢查0.8.5 => 085。但是,如果版本seq很簡單,這將起作用。或者另一種方法是你砍他們,並開始比較各領域