¿Cómo obtener solo el número de versión de php?

15

Quiero obtener solo la versión de php instalada en CentOS.

Salida de 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

Intenté lo siguiente:

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

Pero el resultado que obtuve fue:

7.1.16
(c)

¿Cómo puedo obtener solo 7.1.16?

El único
fuente
77
... | head -1o podría haber mejores formas
LinuxSecurityFreak
Oh, la cabeza -1 es muy simple y elegante. Gracias hombre.
El

Respuestas:

13

En mi sistema:

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

como grep PHPcoincide con cada cadena PHP que encuentra.

Los ^PHPmedios "coinciden solo con la cadena 'PHP' cuando está al comienzo de una línea".

Obviamente, esto funciona si el formato de salida de php -ves consistente en todas las versiones / compilaciones.

Como referencia, todo el resultado fue:

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
Señor shunz
fuente
Esta respuesta fue excelente en el sentido de que también puedo utilizarla para grep la versión de la versión httpd: P httpd -v | awk '/ ^ Versión del servidor / {print $ 3}' | cut -d '/' -f2
The One
143

Extendiendo la respuesta de Jeff Schaller , omita la tubería por completo y solo solicite la representación constante interna:

$ php -r 'echo PHP_VERSION;'
7.1.15

Puede extender este patrón para obtener más o menos información:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Consulte la lista PHP de constantes predefinidas para ver todas las disponibles.

El principal beneficio: no se basa en un formato de salida definido de php -v. Dado que tiene el mismo rendimiento que una solución de tubería, parece una opción más sólida.


Si su objetivo es probar la versión, también puede usar este patrón. Por ejemplo, este código saldrá 0si PHP> = 7, y de lo 1contrario:

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

Como referencia, aquí hay tiempos para varios casos de prueba, ordenados primero más rápido:

$ 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
obispo
fuente
26
Esta es realmente la única respuesta correcta. No hay garantía de que la obra de diferentes PHP tendrá el mismo formato de salida paraphp -v
esponjosa
Esta fue en realidad la primera solución que se me ocurrió. Si bien tratar de analizar la salida es mucho más rápido, probablemente no sea tan confiable como compilar el código y ejecutarlo.
Ismael Miguel
@IsmaelMiguel Supuse lo contrario: compilar y ejecutar sería más rápido que bifurcar una tubería. Sin embargo, a partir de los experimentos de temporización, descubrí que no hay diferencia estadística en el tiempo de ejecución para ninguna de las soluciones.
obispo el
1
Bueno, tienes la sobrecarga de hacer PHP> opcode, opcode> C y C en lenguaje de máquina. Esta sobrecarga es siempre constante. PHP puede tener habilitado opcache, lo que acorta mucho esta vez. Por otro lado, debe generar procesos y pasar la salida a la entrada y lo que no. Esperaría que php sea más lento cuando se ejecuta varias veces (5-10), en comparación con el análisis de la salida. pero gracias por las pruebas
Ismael Miguel
21

Si ha instalado php a través del administrador de paquetes (por ejemplo, RPM o yum), puede consultar la versión desde allí:

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

Alternativamente, puede pedirle a php que le diga su versión directamente :

php -r 'echo phpversion();'
Jeff Schaller
fuente
6

Hay diferentes maneras, me gusta usar mirar hacia atrás:

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

o

php -v | grep -Po '(?<=PHP )([0-9.]+)'
Ravexina
fuente
consejo menor: el \ es innecesario en la segunda expresión regular; .El significado normal sería inútil dentro de una clase de caracteres, por lo que ya se trata como literal por defecto
user371366
wow, eso fue un dolor. ¿Hay alguna forma de poner una barra invertida en las etiquetas `? doblar la barra no funcionó
user371366
@ dn3s cita el patrón, funciona para mí con una barra invertida simple ...
Ravexina
oh,
quiero
Publicar un comentario mientras se vota abajo sería apropiado ...
Ravexina
5

Desde que comenzó awk, aquí hay una awksolución:

$ php -v | awk '/^PHP/{print $2}'
7.2.10
terdon
fuente
2
php -v | awk NR==1'{print $2}'

O

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

fuente
1
También puede imprimir solo la primera línea diciendoawk '{print $2; exit}'
fedorqui
0

Si desea hacerlo con una sola función canalizada, puede intentar usar sed de esta manera:

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

Primero elimina cualquier línea que no comience PHP, luego recorta la versión de esa línea asumiendo que es la primera secuencia en forma de x.y.z.

O, si desea algo más cercano a su script original, simplemente coloque ^el frente de su patrón grep para buscar solo líneas que comiencen con PHP:

php -v | grep ^PHP | awk '{print $2}'
Christian Gibbons
fuente
Me gusta cómo funcionó simplemente agregando ^ delante del patrón grep. Brillante.
El
0

Creo que esta es una solución más limpia y elegante (también debería funcionar en Windows):

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

La salida sería como 7.2.24.

Max_Payne
fuente
Esto parece estar fuertemente basado en unix.stackexchange.com/a/471594/117549 , y quizás sea mejor como una edición de esa otra respuesta, para incluir la única parte nueva:.PHP_MINOR_VERSION
Jeff Schaller