Come ottenere solo il numero di versione di php?


15

Voglio ottenere solo la versione di php installata su CentOS.

Uscita di 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

Ho provato questo seguente:

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

Ma l'output che ho ottenuto è stato:

7.1.16
(c)

Come posso ottenere solo il 7.1.16?


7
... | head -1o potrebbero esserci modi migliori
LinuxSecurityFreak il

Oh, la testa -1 è molto semplice ed elegante. Grazie uomo.
The One,

Risposte:


13

Sul mio sistema:

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

come grep PHPcorrisponde a ogni stringa PHP che incontra.

Il ^PHPsignificato "corrisponde solo alla stringa" PHP "quando si trova all'inizio di una riga".

Ovviamente, questo funziona se il formato di output di php -vè coerente tra versioni / build.

Per riferimento, l'intero output era:

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

Questa risposta è stata fantastica in un certo senso che posso utilizzarla per grep anche la versione della versione httpd: P httpd -v | awk '/ ^ Versione server / {print $ 3}' | cut -d '/' -f2
The One

143

Estendendo la risposta di Jeff Schaller , salta del tutto la pipeline e chiedi semplicemente la rappresentazione interna costante:

$ php -r 'echo PHP_VERSION;'
7.1.15

È possibile estendere questo modello per ottenere più o meno informazioni:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Vedi l' elenco PHP delle costanti predefinite per tutte le disponibili.

Il vantaggio principale: non si basa su un formato di output definito di php -v. Dato che si tratta delle stesse prestazioni di una soluzione pipeline, allora sembra una scelta più solida.


Se il tuo obiettivo è testare la versione, puoi anche utilizzare questo modello. Ad esempio, questo codice verrà chiuso 0se PHP> = 7, e 1altrimenti:

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

Per riferimento, ecco i tempi per vari casi di test, ordinati prima per primi:

$ 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
Questa è davvero l'unica risposta corretta. Non vi è alcuna garanzia che versioni diverse di PHP avranno lo stesso formato di output perphp -v
soffice

Questa è stata in realtà la prima soluzione che mi è venuta in mente. Mentre si tenta di analizzare l'output è più veloce dei mondi, probabilmente non è affidabile come compilare il codice ed eseguirlo.
Ismael Miguel,

@IsmaelMiguel Avevo presunto il contrario: compilare ed eseguire sarebbe più veloce del fork di una pipeline. Tuttavia, dagli esperimenti sui tempi ho scoperto che non esiste alcuna differenza statistica nel tempo di esecuzione per entrambe le soluzioni.
vescovo

1
Bene, hai il sovraccarico di fare PHP> opcode, opcode> C e C nel linguaggio macchina. Questo sovraccarico è sempre costante. PHP potrebbe avere abilitato opcache, che questa volta si accorcia molto. D'altra parte, devi generare processi e passare l'output all'input e cosa no. Mi aspetto che php sia più lento quando viene eseguito alcune volte (5-10), rispetto all'analisi dell'output. ma grazie per i test.
Ismael Miguel,

21

Se hai installato php tramite il gestore dei pacchetti (ad es. RPM o yum), puoi interrogare la versione da lì:

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

In alternativa, puoi chiedere a php di dirti direttamente la sua versione :

php -r 'echo phpversion();'

6

Ci sono diversi modi, mi piace usare look behind:

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

o

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

suggerimento minore: il \ non è necessario nella seconda regex; .Il significato normale sarebbe inutile all'interno di una classe di caratteri, quindi è già trattato come letteralmente di default
user371366

wow, è stato un dolore. c'è un modo per inserire una singola barra rovesciata nei tag `? raddoppiare la barra non ha funzionato
user371366

@ dn3s cita lo schema, funziona per me con una singola barra rovesciata ...
Ravexina,

oh volevo dire, volevo solo un singolo \ carattere racchiuso tra i tag del codice
user371366,

Pubblicare un commento dando un voto
negativo

5

Da quando hai iniziato awk, ecco una awksoluzione:

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

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

O

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

1
Puoi anche stampare solo la prima riga dicendoawk '{print $2; exit}'
fedorqui,

0

Se vuoi farlo con una sola funzione in fase di piping, puoi provare a usare sed in questo modo:

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

Prima cancella qualsiasi linea che non inizia con PHP, quindi ritaglia la versione da quella linea assumendo che sia la prima sequenza nella forma di x.y.z.

Oppure, se vuoi qualcosa di più vicino al tuo script originale, metti semplicemente ^in primo piano il tuo modello grep per cercare solo le linee che iniziano con PHP:

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

Mi piace il modo in cui ha funzionato semplicemente aggiungendo ^ davanti al modello grep. Brillante.
The One

0

Penso che questa sia una soluzione più pulita ed elegante (dovrebbe funzionare anche in Windows):

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

L'output sarebbe simile 7.2.24.


Questo sembra essere fortemente basato su unix.stackexchange.com/a/471594/117549 , ed è forse meglio come modifica per quell'altra risposta, per includere l'unica parte nuova:.PHP_MINOR_VERSION
Jeff Schaller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.