Como obter apenas o número da versão do php?

13

Eu quero apenas obter a versão do php instalada no CentOS.

Saída 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

Eu tentei o seguinte:

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

Mas a saída que recebi foi:

7.1.16
(c)

Como posso obter apenas 7.1.16?

    
por The One 26.09.2018 / 10:41

7 respostas

13

No meu sistema:

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

como grep PHP corresponde a todas as cadeias PHP encontradas.

O ^PHP significa "corresponde apenas à string 'PHP' quando está no início de uma linha".

Obviamente, isso funciona se o formato de saída de php -v for consistente em versões / versões.

Para referência, toda a saída foi:

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
    
por 26.09.2018 / 10:59
141

Estendendo a resposta de Jeff Schaller , ignore o pipeline e peça a representação interna constante:

$ php -r 'echo PHP_VERSION;'
7.1.15

Você pode estender esse padrão para obter mais ou menos informações:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Veja a lista PHP de constantes pré-definidas para todas as informações disponíveis.

O principal benefício: ele não depende de um formato de saída definido de php -v . Dado que é o mesmo desempenho de uma solução de pipeline, então parece uma escolha mais robusta.

Se o seu objetivo é testar a versão, você também pode usar esse padrão. Por exemplo, esse código sairá de 0 se PHP > = 7 e 1 caso contrário:

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

Para referência, aqui estão os horários para vários casos de teste, ordenados mais rapidamente primeiro:

$ 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
    
por 26.09.2018 / 15:33
20

Se você instalou o php por meio do gerenciador de pacotes (por exemplo, RPM ou yum), poderá consultar a versão a partir dele:

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

Alternativamente, você pode pedir ao php para lhe informar sua versão diretamente :

php -r 'echo phpversion();'
    
por 26.09.2018 / 14:36
6

Existem diferentes maneiras, eu gosto de olhar para trás:

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

ou

php -v | grep -Po '(?<=PHP )([0-9.]+)'
    
por 26.09.2018 / 11:06
5

Desde que você começou com awk , aqui está uma awk solution:

$ php -v | awk '/^PHP/{print $2}'
7.2.10
    
por 26.09.2018 / 17:07
2
php -v | awk NR==1'{print $2}'

Ou

php -v | awk '{print $2; exit}'
    
por 26.09.2018 / 19:47
0

Se você quiser fazer isso com apenas uma única função sendo canalizada, você pode tentar usar sed assim:

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

Primeiro, exclui qualquer linha que não comece com PHP e, em seguida, captura a versão dessa linha, supondo que seja a primeira sequência na forma de x.y.z .

Ou, se você quiser algo mais próximo do seu script original, basta colocar ^ na frente do seu padrão grep para procurar apenas por linhas que começam com o PHP:

php -v | grep ^PHP | awk '{print $2}'
    
por 26.09.2018 / 18:40

Tags