Regex 如何在shell脚本中以编程方式提取Python版本?
在终端中输入Regex 如何在shell脚本中以编程方式提取Python版本?,regex,bash,awk,sed,Regex,Bash,Awk,Sed,在终端中输入python--version,我想确认(在shell中也是以shell编程的形式)是否安装了3个或更高版本的python。比如说, Python 3.2.1 将产生True或某种形式的确认,其中 python2.2p1或python2.1.4将产生False 我曾尝试通过sed或grep使用regex,但没有成功 注意,这与一些人认为的是重复的不同,因为我要求的是能够自动确认安装了python3或更高版本的shell编程代码,而不是手动检查它的方法(只需输入python--ver
python--version
,我想确认(在shell中也是以shell编程的形式)是否安装了3个或更高版本的python。比如说,
Python 3.2.1
将产生True
或某种形式的确认,其中
python2.2p1
或python2.1.4
将产生False
我曾尝试通过sed或grep使用regex,但没有成功
注意,这与一些人认为的是重复的不同,因为我要求的是能够自动确认安装了python3或更高版本的shell编程代码,而不是手动检查它的方法(只需输入
python--version
)。下面是执行此任务的示例awk脚本:
echo $(python --version) | awk 'BEGIN{found="false"}/python-3/{found="true"}END{print found}'
在终端中输入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
是Python2.7.5,但python3.4.8可以通过命令python3
获得。您可以对上述内容进行扩展,以测试Python 3的一些可能的替代名称,但您无法安全、可靠或高效地执行详尽的测试,以确定Python 3是否安装在任何名称或路径下。在Bash中执行此操作的最简单方法是使用sort-V
为了解决bash中比较版本字符串的问题,这里有一个简单的compare()
函数,它接受两个参数a和b,如果a&1 | perl-pe's/python*//i'),则返回true;b=3
[“$((echo“$a”echo“$b”)| sort-V | head-1)”==“$b”]
}
此函数将计算实际安装的Python版本,并使用sort-V
将其与“3”进行比较,并返回false,除非安装了3或更高版本
注意这里使用Perl进行不区分大小写的正则表达式搜索和替换。(并非所有sed都具有不区分大小写的功能。)
这样做的好处是,当您调用它时,您可以获得可读的代码,如:
如果安装了python3\u;然后
#是的!
其他的
# ...
fi
最后,根据排序-V
的文档(来自BSD手册;POSIX没有指定-V
选项,但大多数排序似乎都有):
对版本号进行排序。输入行被视为格式前缀版本后缀中的文件名,其中后缀匹配正则表达式(.([A-Za-z~][A-Za-z0-9~]*)?)*
。通过前缀和版本比较文件(版本号中忽略前导零,请参见下面的示例)。如果输入字符串与模式不匹配,则使用byte compare函数对其进行比较。所有字符串比较都在C语言环境中执行,忽略语言环境设置
看到没有安装Python时的输出了吗?在您的例子中,似乎根本没有安装Python。要捕获这种情况,您应该询问您的包管理器,而不是使用
python-V
。您使用哪个软件包管理器?它是apt吗?另外,如果您想使用版本3,那么调用python3
,而不仅仅是python
。据我所知,它甚至不应该在脚本中运行。这不是一个复制,至少不是选定的复制目标。这里的问题不是如何让Python报告其版本(dupe目标的主题及其所有答案),而是如何编写一个解释该输出(可能还有其他输出)的shell脚本。它并没有显示您使用的版本。echo用于向awk提供标准输出。如果没有echo命令,awk需要输入文件。不,您完全错了。如果Python将版本信息打印到标准输出,那么管道会将其馈送到Awk的标准输入以及echo
;如果没有,你的echo
根本帮不上忙。。。。但事实并非如此python--version
将其输出定向到stderr,而不是stdout。此外,当python
是版本3的cpython时,它的错误输出与/python3/
不匹配。重新考虑后,我认为这应该是公认的答案,我的解决方案在考虑需求时设计过度。
`-V, --version-sort`