2012-11-09 6 views
6

私は次のシェルスクリプトを使ってpythonのバージョンを問い合わせます。それは私に、文の上に"Integer expression expected"というエラーを与えます。シェルスクリプトのチェック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 

'0' を出力します '$ PYTHON_VERSIONエコー'、なぜif文の仕事はdosn't?

編集:私はここのWindowsとCygwin

+0

は、あなたが使用しているOSは何とシェルclairifyでしたか?私はOS Xの下で、bashとzshでうまく動作しようとしました。 – emperorcezar

答えて

5

良い質問です。私にとってはうまくいっています。あなたは常に評価変数($Xの代わりに"$X")を引用する必要があります。多分あなたのエラーを修正します。

case "$(python --version 2>&1)" in 
    *" 3."*) 
     echo "Fine!" 
     ;; 
    *) 
     echo "Wrong Python version!" 
     ;; 
esac 
:あなたは完全に殻に滞在したい場合

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

、あなたも--versionオプションを使用することができます。

は、しかし、私は代わりに、その出力のPythonスクリプトの結果を使用することを提案します

これはもっと読みやすいかもしれません。

+0

うまく働いてくれてありがとう、 – KaiserJohaan

0

を使用しています可能な解決策である

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

これは私がsleekxmppから持っていた例からですが、それはあなたが私は信じて必要なものを行います。

+1

シェル側で彼の問題はありませんか? – Alfe

2

$ PYTHON_VERSIONに格納された結果が整数ではないため、等価性テストが2つの異なる型で行われているためです。

あなたがもしに変更することができます。

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

またはあなただけ行うことができます。

if [ $PYTHON_VERSION = 0 ]; then 
+0

ok、私はbashが暗黙のうちにstring-to-intとint-to-stringの間で変換されると思ったのですか? – KaiserJohaan

+0

それは、問題は変換ではなく、-eqが式を解釈する方法です。あなたが持っている必要があるいくつかのケースがあります:if [[]]の代わりに[]、または-eqは正しいことをしません。 – xmonk

関連する問題