2012-11-09 140 views
6

我有以下shell腳本來查詢python版本。它給我一個錯誤,說明if語句中的"Integer expression expected"shell腳本檢查python版本

#!/bin/bash 


PYTHON_VERSION=`python -c 'import sys; print("%i" % (sys.hexversion<0x03000000))'` 

echo $PYTHON_VERSION 

if [ $PYTHON_VERSION -eq 0 ] 
then 
    echo "fine!" 
fi 

'echo $ PYTHON_VERSION'打印出'0',那麼爲什麼dos不要if語句工作?

編輯:在這裏我使用的是Windows和Cygwin

+0

你能clairify什麼操作系統和外殼您正在使用?我用bash和zsh在OS X下試了一下,工作正常。 – emperorcezar

回答

5

好問題。對我來說它工作正常。你總是應該引用評估變量("$X"而不是$X);也許這可以修復你的錯誤。

但我建議使用Python腳本,而不是它的輸出結果:

#!/bin/bash 
if python -c 'import sys; sys.exit(1 if sys.hexversion<0x03000000 else 0)' 
then 
    echo "Fine!" 
fi 

如果你喜歡留在殼完全,你也可以使用--version選項:

case "$(python --version 2>&1)" in 
    *" 3."*) 
     echo "Fine!" 
     ;; 
    *) 
     echo "Wrong Python version!" 
     ;; 
esac 

也許這更可讀。

+0

謝謝,這工作得很好 – KaiserJohaan

0

是一個可能的解決方案

if sys.version_info < (3, 0): 
    reload(sys) 
    sys.setdefaultencoding('utf8') 
else: 
    raw_input = input 

這是一個例子,我從sleekxmpp了,但它確實你需要什麼,我相信。

+1

是不是他的殼側問題? – Alfe

2

它不工作的原因是因爲存儲在$ PYTHON_VERSION中的結果不是一個整數,所以您的相等性測試正在用兩種不同的類型完成。

您可以更改,如果到:

if [ $PYTHON_VERSION -eq "0" ]; then 
    echo "fine!" 
fi 

,或者你可以這樣做:

if [ $PYTHON_VERSION = 0 ]; then 
+0

好吧,我以爲bash會隱式地在字符串到int和int到字符串之間轉換嗎? – KaiserJohaan

+0

它的確如此,問題不在於轉換,而是-eq是如何解釋表達式的。有些情況下你需要:if [[]]而不是if [],否則-eq不會做正確的事情。 – xmonk