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


15

Quero obter apenas 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 obtive foi:

7.1.16
(c)

Como posso obter apenas 7.1.16?


7
... | head -1ou pode haver maneiras melhores
LinuxSecurityFreak

Oh, a cabeça -1 é muito simples e elegente. Obrigado cara.
O Uma

Respostas:


13

No meu sistema:

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

como grep PHPcorresponde a cada seqüência de PHP que encontra.

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

Obviamente, isso funciona se o formato de saída php -vfor consistente entre versões / compilaçõ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

Essa resposta foi ótima no sentido de que eu também posso utilizá-la para grep a versão da versão httpd: P httpd -v | awk '/ ^ Versão do servidor / {print $ 3}' | cut -d '/' -f2
O único

143

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

$ 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 predefinidas para todos os disponíveis.

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


Se seu objetivo é testar a versão, você também pode usar esse padrão. Por exemplo, esse código será encerrado 0se PHP> = 7 e, 1caso 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

26
Esta é realmente a única resposta correta. Não há garantia de que diferentes versões do PHP terá o mesmo formato de saída paraphp -v
fofo

Esta foi realmente a primeira solução que me veio à cabeça. Embora tentar analisar a saída seja mais rápido, provavelmente não é tão confiável quanto compilar o código e executá-lo.
Ismael Miguel

@IsmaelMiguel Eu presumi o contrário: compilar e executar seria mais rápido do que bifurcar um oleoduto. No entanto, descobri a partir de experimentos de tempo que não há diferença estatística no tempo de execução para qualquer solução.
bispo

1
Bem, você tem a sobrecarga de executar PHP> opcode, opcode> C e C na linguagem de máquina. Essa sobrecarga é sempre constante. O PHP pode ter o opcache ativado, o que reduz muito esse tempo. Por outro lado, você precisa gerar processos e passar a saída para entrada e o que não. Eu esperaria que o php fosse mais lento quando executado algumas vezes (5 a 10), em comparação com a análise da saída. mas obrigado pelos testes.
Ismael Miguel

21

Se você instalou o php através do gerenciador de pacotes (por exemplo, RPM ou yum), pode consultar a versão a partir daí:

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

Como alternativa, você pode pedir ao php para informar sua versão diretamente :

php -r 'echo phpversion();'

6

Existem diferentes maneiras, eu gosto de usar o look behind:

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

ou

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

dica menor: o \ é desnecessário no segundo regex; .o significado normal de seria inútil dentro de uma classe de caracteres, por isso já é tratado como literal por padrão
user371366

uau, isso foi uma dor. existe alguma maneira de colocar uma barra invertida em tags `? dobrar a barra não trabalho
user371366

@ dn3s citar o padrão, ele funciona para mim com uma única barra invertida ...
Ravexina

oh eu quis dizer, eu só queria um único caractere \ fechado em tags de código
user371366

Postando um comentário ao dar um voto para baixo seria apropriado ...
Ravexina

5

Desde que você começou awk, aqui está uma awksolução:

$ 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
Você também pode imprimir apenas a primeira linha dizendoawk '{print $2; exit}'
fedorqui

0

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

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

Primeiro, ele exclui qualquer linha que não comece PHP, depois corta a versão dessa linha, assumindo que é 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 as linhas que começam com o PHP:

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

Eu gosto da maneira como funcionou apenas adicionando ^ na frente do padrão grep. Brilhante.
O único

0

Eu acho que esta é uma solução mais limpa e elegante (também deve funcionar no Windows):

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

A saída seria como 7.2.24.


Isso parece ser fortemente baseado em unix.stackexchange.com/a/471594/117549 , e talvez seja melhor como uma edição dessa outra resposta, para incluir a única nova parte:.PHP_MINOR_VERSION
Jeff Schaller
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.