Shell脚本检查Python版本

6
我有以下的shell脚本来查询Python版本,但在if语句中它给我一个错误提示"Integer expression expected"。
#!/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',那么为什么 if 语句不起作用呢?

编辑:我正在使用 Windows 和 Cygwin。


你能澄清一下你使用的操作系统和Shell吗?我在OS X下尝试了bash和zsh,运行良好。 - emperorcezar
3个回答

7

好问题。对我来说它运行良好。您应该始终引用已评估的变量("$X"而不是$X),也许这可以解决您的错误。

但是我建议使用Python脚本的结果而不是其输出:

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

如果您希望完全留在 shell 中,您也可以使用 --version 选项:

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

也许这更易读一些。

2

无法正常工作的原因是因为$PYTHON_VERSION中存储的结果不是整数,因此您的等式测试使用了两种不同类型。

您可以将if语句更改为:

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

或者你可以直接执行以下操作:

if [ $PYTHON_VERSION = 0 ]; then

好的,我以为Bash会自动隐式地在字符串和整数之间进行转换? - KaiserJohaan
它确实有问题,问题不在于转换,而在于-eq如何解释表达式。有些情况下,你需要使用if [[ ]]而不是if [ ],否则-eq无法正确执行。 - xmonk

0

这里有一个可能的解决方案

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

这是我从sleekxmpp的一个示例中得到的,但我相信它可以满足你的需求。


1
他的问题不是出在shell这一端吗? - Alfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接