2

我正在编写一个 shell 脚本,在检查系统上的 python 版本后做一些工作。

我做了 a=`python -V` 和 $a 的回声:

[root@machine folder]# a=`python -V`
Python 2.3.4
[root@machine folder]# echo $a

什么echo $a都不输出

同时我这样做:

[root@machine folder]# if grep "2.3.4" `python -V` ; then echo "bad" ; fi
Python 2.3.4

在我按 Enter 后,它只输出 python 的版本,但没有别的。

为什么它会这样?我还有其他方法可以完成相同的任务吗?

4

2 回答 2

7

python -V似乎在输出stderr。如果你跑

a=`python -V` 

输出出现在控制台上(即它没有被子shell分配拾取)。但是,如果您重定向stderr到标准输出,那么

a=`python -V 2>&1` 

作品

于 2013-02-06T17:40:52.287 回答
1

真的值得通过 Python 询问sys吗?

 python -c "import sys; print sys.version_info[0:3]"

 (2, 7, 3)

这样一来,除了检查版本之外,还可以检查版本值。

pyver=$(python -c "import sys; print sys.version_info[0:3]")
required="(2, 7, 1)"
echo pyver=$pyver

if [[ "$pyver" > "$required" ]] ; then
    echo safe to proceed
else
    echo  require Python version ">" $required got $pyver
fi

required="(3, 0, 0)"
if [[ "$pyver" > "$required" ]] ; then
    echo safe to proceed
else
    echo  require Python version ">" $required got $pyver
fi

#-- use integer values --
echo  Integer version
# Trouble being the output looks odd but allows use of -gt
pyver=$(python -c "import sys; print '%03d%03d%03d' % sys.version_info[0:3]")
required="002007001"
echo pyver=$pyver

if [[ $pyver -gt  $required ]] ; then
    echo safe to proceed
else
    echo  require Python version $required got $pyver
fi

required="003000000"
if [[ $pyver -gt $required ]] ; then
    echo safe to proceed
else
    echo  require Python version $required got $pyver
fi

使用 Python 2.7.3 版在我的系统上输出

pyver=(2, 7, 3)
safe to proceed
require Python version > (3, 0, 0) got (2, 7, 3)
Integer version
pyver=002007003
safe to proceed
require Python version 003000000 got 002007003
于 2013-02-07T09:38:07.067 回答