2012-11-09 45 views
6

Tôi có kịch bản lệnh shell sau để truy vấn phiên bản python. Nó cho tôi một lỗi nêu rõ "Integer expression expected" trên if-statement.shell scripting kiểm tra phiên bản 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' in '0', vậy tại sao lệnh if-statement không thành công?

EDIT: Tôi đang sử dụng Windows và Cygwin

+0

Ông có thể clairify gì os và bao bạn đang sử dụng? Tôi đã thử nó dưới OS X với bash và zsh, hoạt động tốt. – emperorcezar

Trả lời

5

Câu hỏi hay. Đối với tôi, nó hoạt động tốt. Bạn luôn phải trích dẫn các biến được đánh giá ("$X" thay vì $X); có thể sửa lỗi của bạn.

Nhưng tôi đề xuất sử dụng kết quả của kịch bản python thay vì sản lượng của nó:

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

Nếu bạn muốn ở lại trong vỏ hoàn toàn, bạn cũng có thể sử dụng --version tùy chọn:

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

Có thể điều đó dễ đọc hơn.

+0

cảm ơn bạn, mà làm việc tốt – KaiserJohaan

0

đây là một giải pháp khả thi

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

này là từ một ví dụ tôi đã từ sleekxmpp, nhưng nó những gì bạn cần tôi tin.

+1

Không phải vấn đề của anh ta ở phía bên phải sao? – Alfe

2

Lý do tại sao nó không hoạt động là vì kết quả được lưu trữ trong $ PYTHON_VERSION không phải là số nguyên, do đó kiểm tra bình đẳng của bạn đang được thực hiện với hai loại khác nhau.

Bạn có thể thay đổi nếu để:

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

hoặc bạn chỉ có thể làm:

if [ $PYTHON_VERSION = 0 ]; then 
+0

ok, tôi nghĩ bash sẽ chuyển đổi giữa chuỗi-to-int và int-to-string ngầm? – KaiserJohaan

+0

Nó có, vấn đề không phải là với việc chuyển đổi nhưng làm thế nào -eq là diễn giải biểu thức. Có một số trường hợp bạn cần phải có: nếu [[]] thay vì nếu [], hoặc -eq sẽ không làm điều đúng. – xmonk

Các vấn đề liên quan