Comment obtenir uniquement le numéro de version de php?


15

Je souhaite obtenir uniquement la version de php installée sur CentOS.

Sortie 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

J'ai essayé ceci:

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

Mais la sortie que j'ai obtenue était:

7.1.16
(c)

Comment puis-je obtenir uniquement 7.1.16?


7
... | head -1ou il pourrait y avoir de meilleures façons
LinuxSecurityFreak

Oh, la tête -1 est très simple et élégante. Merci mec.
The One

Réponses:


13

Sur mon système:

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

as grep PHPcorrespond à chaque chaîne PHP rencontrée.

Le ^PHPmoyen "correspond uniquement à la chaîne 'PHP' lorsqu'elle se trouve au début d'une ligne".

Évidemment, cela fonctionne si le format de sortie de php -vest cohérent entre les versions / builds.

Pour référence, l'ensemble de la sortie était:

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

Cette réponse était géniale dans le sens où je peux également l'utiliser pour grep la version de la version httpd: P httpd -v | awk '/ ^ Version serveur / {print $ 3}' | cut -d '/' -f2
The One

143

En étendant la réponse de Jeff Schaller , sautez complètement le pipeline et demandez simplement la représentation constante interne:

$ php -r 'echo PHP_VERSION;'
7.1.15

Vous pouvez étendre ce modèle pour obtenir plus ou moins d'informations:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Voir la liste PHP des constantes prédéfinies pour tous les disponibles.

Le principal avantage: il ne repose pas sur un format de sortie défini de php -v. Étant donné qu'il s'agit des mêmes performances qu'une solution de pipeline, cela semble un choix plus robuste.


Si votre objectif est de tester la version, vous pouvez également utiliser ce modèle. Par exemple, ce code se fermera 0si PHP> = 7, et 1sinon:

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

Pour référence, voici les horaires de divers cas de test, commandés en premier:

$ 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
C'est vraiment la seule bonne réponse. Il n'y a aucune garantie que différentes versions de PHP auront le même format de sortie pourphp -v
fluffy

C'était en fait la première solution qui m'est venue à l'esprit. Tout en essayant d'analyser la sortie est plus rapide, il n'est probablement pas aussi fiable que de compiler le code et de l'exécuter.
Ismael Miguel

@IsmaelMiguel J'avais supposé le contraire: compiler et exécuter serait plus rapide que bifurquer un pipeline. Cependant, j'ai trouvé des expériences de synchronisation qu'il n'y a aucune différence statistique dans le temps d'exécution pour l'une ou l'autre solution.
évêque

1
Eh bien, vous avez la surcharge de faire PHP> opcode, opcode> C et C en langage machine. Cette surcharge est toujours constante. PHP peut avoir opcache activé, ce qui raccourcit beaucoup cette fois. D'un autre côté, vous devez générer des processus et passer la sortie à l'entrée et à quoi d'autre. Je m'attendrais à ce que php soit plus lent lorsqu'il a été exécuté plusieurs fois (5-10), par rapport à l'analyse de la sortie. mais merci pour les tests.
Ismael Miguel

21

Si vous avez installé php via le gestionnaire de paquets (par exemple RPM ou yum), vous pouvez alors interroger la version à partir de là:

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

Alternativement, vous pouvez demander à php de vous dire sa version directement :

php -r 'echo phpversion();'

6

Il y a différentes façons, j'aime utiliser look behind:

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

ou

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

petite astuce: le \ n'est pas nécessaire dans le deuxième regex; .La signification normale de 'serait inutile dans une classe de caractères, elle est donc déjà traitée comme littérale par défaut
user371366

wow, c'était une douleur. existe-t-il un moyen de mettre une seule barre oblique inverse dans les balises? doubler la barre oblique n'a pas fonctionné
user371366

@ dn3s cite le motif, cela fonctionne pour moi avec une barre oblique inverse simple
Ravexina

oh je voulais dire, je voulais juste un seul caractère \ enfermé dans les balises de code
user371366

Poster un commentaire tout en donnant un vote
négatif

5

Depuis vos débuts awk, voici une awksolution:

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

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

Ou

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

1
Vous pouvez également imprimer uniquement la première ligne en disantawk '{print $2; exit}'
fedorqui

0

Si vous voulez le faire avec une seule fonction pipée, vous pouvez essayer d'utiliser sed comme ceci:

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

D'abord, il supprime toute ligne qui ne commence pas PHP, puis il coupe la version de cette ligne en supposant qu'il s'agit de la première séquence sous la forme de x.y.z.

Ou, si vous voulez quelque chose de plus proche de votre script d'origine, placez-le simplement ^devant votre modèle grep pour ne rechercher que les lignes commençant par PHP:

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

J'aime la façon dont cela a fonctionné en ajoutant simplement ^ devant le motif grep. Brillant.
The One

0

Je pense que c'est une solution plus propre et élégante (devrait également fonctionner sous Windows):

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

La sortie serait comme 7.2.24.


Cela semble être fortement basé sur unix.stackexchange.com/a/471594/117549 , et est peut-être mieux en tant que modification de cette autre réponse, pour inclure la seule nouvelle partie:.PHP_MINOR_VERSION
Jeff Schaller
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.