2015-07-20 67 views
2

我試圖比較版本號。例如,如果10.9小於10.11。理解bash *字符串*比較

有人可以解釋爲什麼這不打印'是'?

if [[ "9" < "10" ]]; then echo yes; fi 

我需要做些什麼才能使這項工作正確清晰,9應該少於10?

另外,如果我有「10.9」在變量$ VERSION,怎麼會變成這樣與「10.11」相比,因爲這也無法打印「是」

if [[ $VERSION < "10.11" ]]; then echo yes; fi 

回答

2

在這種情況下,這將返回正確的答案

if [[ "8" < "9" ]]; then echo yes; fi 

但是對於您的具體情況爲「10」小於「9」,因爲1是小於9 字符串比較的作品比數字不同,所以爲了將類似的東西

...

您可以將字符串轉換爲數字,並使用-lt(小於)運算符爲數字值。擊值是無類型的話,這將工作

if [ "9" -lt "10" ]; then echo yes; fi 

一些猛砸參考可以發現here

要知道,「10.9」 LT不與浮工作。你可以使用awk比較這個。

if [ -n "10.1" -a -n "10.2" ]; then echo yes; fi 
+0

對不起,我的錯誤。經過四處努力試圖讓它工作,我錯過了報價。這是字符串比較,所以-lt不起作用。 – TheDarkKnight

+1

編輯答案 – Vargan

+0

謝謝,這是有道理的,雖然我收到作爲字符串變量的版本號,我將如何將其轉換爲數字。正如我的問題所提到的,與「10.11」相比,版本是「10.9」。 – TheDarkKnight

1

由於<比較運算符"9"按字典順序"10"更大bash只能比較整數(使用-lt,在這種情況下[ "9" -lt "10 ]將爲true。(請注意bash沒有單獨的字符串和整數類型,只有字符串,意思是"9"9是完全相同的字符串。它是運算符,而不是操作數,決定的行爲。)

bash不會與所有浮點值的工作,你需要使用一個外部命令(如bcawk)對他們進行比較。當然,如果你的版本號可以包含更多小於1小數點,那麼您需要使用其他一些方法,因爲它們不再是浮點數。

+0

我覺得這個工作有點不成熟。當$ VERSION是10.9或10.12時,它們都輸出'yes'。 – TheDarkKnight

+0

我忽略了bc如何工作。它輸出1 =真,0 =假字符串;退出狀態與比較結果無關。 – chepner

+0

比較** bc <<<「10.9 <10.11」**和** bc <<<「10.12 <10.11」**,他們都返回0 – TheDarkKnight