如何使用正则表达式在shell /终端中提取Python版本?

时间:2019-05-24 13:56:04

标签: regex bash awk sed

使用python --version作为终端中的输入,我想确认(同样在shell中以shell编程的形式)是否安装了3个或更高版本的python。例如,

Python 3.2.1

会产生True或某种形式的确认,其中 python2.2p1Python 2.1.4将产生False

我尝试通过sed或grep使用正则表达式,但无法获取。

注意,这与某些人认为是重复的事情有所不同,因为我要问的是可以自动确认是否安装了python3或更高版本的shell编程代码,而不是手动检查它的方法(只需输入python --version

3 个答案:

答案 0 :(得分:2)

  

在终端中输入python --version作为输入时,我想确认(同样在shell中以shell编程的形式)是否安装了3个或更高版本的python。

如果python命令启动任何版本的cpython,则python --version的输出(输出到其stderr,而不是stdout)将具有以下格式:

Python X.Y.Z

您可以像这样在shell脚本中进行测试:

if python --version 2>&1 | grep -q '^Python 3\.'; then
  # It's python 3 ...
else
  # It's not python 3; maybe not installed
fi

请注意,您最初在问题中显示的输出表明根本没有安装Python。上面的方法将在该事件中执行else分支。另请注意,可以使用其他名称安装Python-例如,在我键入此名称的系统上,python是Python 2.7.5,但可以通过以下命令使用Python 3.4.8 python3。您可以扩展上述内容,以测试Python 3的一些可能的替代名称,但是您不能安全,可靠或有效地进行详尽的测试,以确定是否以任何名称或路径安装了Python 3。

答案 1 :(得分:0)

在Bash中最简单的方法是使用sort -V

要解决在bash中通常比较版本字符串的问题,这是一个简单的compare()函数,该函数接受两个参数a和b,如果a <= b,则返回true。然后一些单元测试显示了其对各种Python版本输入的有效性:

# test.sh

compare() {
  local a=$1 ; local b=$2
  [ "$( (echo "$a" ; echo "$b") | sort -V | head -1)" == "$a" ]
}

test22p1() {
  compare "2.2p1" "3.0.0"
  assertTrue "$?"
}

test214() {
  compare "2.1.4" "3.0.0"
  assertTrue "$?"
}

test300() {
  compare "3.0.0" "3.0.0"
  assertTrue "$?"
}

test372() {
  compare "3.7.2" "3.0.0"
  assertFalse "$?"
}

. shunit2

输出:

▶ bash test.sh
test22p1
test214
test300
test372

Ran 4 tests.

OK

(这些单元测试当然假定安装了shunit2。)

关于功能:

它只是在两条单独的行上先回波$a然后回波$b,将其管道传输到sort -V中并取头。如果头部等于左侧,则返回true;否则返回true。否则,如果它等于右侧,则返回false。

在您提到的问题中,您确实想知道是否安装了Python 3或更高版本,因此您可以对其进行修改并添加如下内容:

python3_installed() {
  local a b
  a=$(python --version 2>&1 | perl -pe 's/python *//i') ; b=3
  [ "$( (echo "$a" ; echo "$b") | sort -V | head -1)" == "$b" ]
}

此函数将计算实际安装的Python版本,并使用sort -V将其与“ 3”进行比较,除非安装了3个或更大版本,否则返回false。

请注意使用Perl进行不区分大小写的正则表达式搜索和替换。 (并非所有sed都具有不区分大小写的功能。)

这样做的好处是,您可以在调用时获得可读的代码,例如:

if python3_installed ; then
  # yes it is!
else
  # ...
fi

最后,根据sort -V的文档(来自BSD手册; POSIX没有指定-V选项,但大多数似乎都具有该选项):

`-V, --version-sort`
     

排序版本号。输入行被视为PREFIX VERSION SUFFIX格式的文件名,其中SUFFIX匹配正则表达式(.([A-Za-z~][A-Za-z0-9~]*)?)*。比较文件的前缀和版本(版本号忽略前导零,请参见下面的示例)。如果输入字符串与模式不匹配,则使用字节比较功能对其进行比较。所有字符串比较都在C语言环境中执行,而语言环境环境设置将被忽略。

答案 2 :(得分:-2)

以下是执行该工作的示例awk脚本:

echo $(python --version) | awk 'BEGIN{found="false"}/python-3/{found="true"}END{print found}'