2012-11-09 115 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