如何只获取php的版本号?


15

我只想在CentOS上安装php版本。

输出 php -v

PHP 7.1.16 (cli) (built: Mar 28 2018 13:19:29) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

我尝试了以下方法:

php -v | grep PHP | awk '{print $2}'

但是我得到的输出是:

7.1.16
(c)

我怎样才能只获得7.1.16?


7
... | head -1还是有更好的方法
LinuxSecurityFreak '18

哦,头-1非常简单而优雅。谢啦。
在一个

Answers:


13

在我的系统上:

$> php -v | grep ^PHP | cut -d' ' -f2
7.0.32-0ubuntu0.16.04.1

作为grep PHP比赛的每遇到PHP字符串。

^PHP意思是“只匹配字符串‘PHP’时,它是在一行的开始”。

显然,如果输出格式为 php -v在版本/内部版本之间是一致的。

作为参考,整个输出为:

PHP 7.0.32-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.32-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies

从某种意义上说,这个答案很好,我也可以利用它来grep httpd版本的版本:P httpd -v | awk'/ ^服务器版本/ {print $ 3}'| 切-d“/” - {2
的一个

143

扩展Jeff Schaller的答案,完全跳过管道,只要求内部常量表示即可:

$ php -r 'echo PHP_VERSION;'
7.1.15

您可以扩展此模式以获取更多或更少的信息:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

参见PHP预定义常量列表以获取所有可用的。

主要优点:它不依赖于定义的输出格式php -v。鉴于它的性能与管道解决方案差不多,因此它似乎是一个更可靠的选择。


如果您的目标是测试版本,那么您也可以使用此模式。例如,0如果PHP> = 7,则此代码将退出,1否则:

php -r 'exit((int)version_compare(PHP_VERSION, "7.0.0", "<"));'

作为参考,以下是各种测试用例的时序,以最快的顺序订购:

$ time for (( i=0; i<1000; i++ )); do php -v | awk '/^PHP [0-9]/ { print $2; }' >/dev/null; done

real    0m13.368s
user    0m8.064s
sys     0m4.036s

$ time for (( i=0; i<1000; i++ )); do php -r 'echo PHP_VERSION;' >/dev/null; done

real    0m13.624s
user    0m8.408s
sys     0m3.836s

$ time for (( i=0; i<1000; i++ )); do php -v | head -1 | cut -f2 -d' ' >/dev/null; done

real    0m13.942s
user    0m8.180s
sys     0m4.160s

26
这确实是唯一正确的答案。无法保证不同的PHP版本将具有相同的输出格式php -v
蓬松的

这实际上是我想到的第一个解决方案。虽然尝试解析输出的速度更快,但它可能不如编译代码和运行代码那样可靠。
伊斯梅尔·米格尔

@IsmaelMiguel我已经假定了相反的情况:编译和执行比分叉管道更快。但是,我从时序实验中发现,两种解决方案的运行时间都没有统计差异。
主教

1
好吧,您需要将PHP>操作码,操作码> C和C转换为机器语言。该开销始终是恒定的。PHP可能启用了opcache,这大大缩短了时间。另一方面,您必须生成进程并将输出传递给输入和不传递。我希望与解析输出相比,运行几次(5-10)时php会更慢。但感谢您的测试。
伊斯梅尔·米格尔

21

如果您通过软件包管理器(例如RPM或yum)安装了php,则可以从那里查询版本:

rpm -q --queryformat="%{VERSION}" php

或者,您可以要求php 直接告诉您其版本

php -r 'echo phpversion();'

6

有多种方法,我喜欢在后面使用:

php -v | grep -Po '(?<=^PHP )[^ ]+'

要么

php -v | grep -Po '(?<=PHP )([0-9.]+)'

小技巧:\在第二个正则表达式中是不必要的;.的正常含义在字符类内部将是无用的,因此默认情况下它已被视为原义
user371366 '18

哇,真是痛苦。有什么办法可以在`标签中添加单个反斜杠?加倍斜杠不起作用
user371366

@ dn3s引用该模式,它对我
有用

哦,我的意思是,我只想在代码标签中包含一个\字符
user371366 '18

在投下反对票的同时发表评论将是适当的……
Ravexina

5

既然您从开始awk,这里是一个awk解决方案:

$ php -v | awk '/^PHP/{print $2}'
7.2.10

2
php -v | awk NR==1'{print $2}'

要么

php -v | awk '{print $2; exit}'

1
您也可以说出第一行awk '{print $2; exit}'
fedorqui '18

0

如果您只想通过管道传递单个函数来执行此操作,则可以尝试使用sed,如下所示:

php -v | sed -e '/^PHP/!d' -e 's/.* \([0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/'

首先,它删除所有不以开头的行PHP,然后从该行中剪切版本,并假设它是形式的第一个序列。x.y.z

或者,如果您想要更接近原始脚本的内容,只需将^其放在grep模式的前面,以仅查找以PHP开头的行:

php -v | grep ^PHP | awk '{print $2}'

我喜欢通过在grep模式前面添加^来实现的方式。辉煌。
在一个

0

我认为这是一种更干净,更优雅的解决方案(也应在Windows中使用):

php -r "echo PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION.'.'.PHP_RELEASE_VERSION;"

输出将是7.2.24


这似乎很大程度上基于unix.stackexchange.com/a/471594/117549,作为对其他答案的编辑可能更好,包括唯一的新部分:.PHP_MINOR_VERSION
Jeff Schaller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.