Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在shell脚本中以编程方式提取Python版本?_Regex_Bash_Awk_Sed - Fatal编程技术网

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`