Как получить только номер версии php?

15

Я хочу получить только версию php, установленную на CentOS.

Выход из 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

Я попробовал это следующее:

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

Но результат, который я получил, был:

7.1.16
(c)

Как я могу получить только 7.1.16?

Тот самый
источник
7
... | head -1или могут быть лучшие способы
LinuxSecurityFreak
Ох, голова -1 очень простая и элегантная. Спасибо чувак.
The One

Ответы:

13

В моей системе:

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

as grep PHPсоответствует каждой строке PHP, с которой он сталкивается.

В ^PHPозначает «соответствовать только строке„PHP“ , когда он находится в начале строки».

Очевидно, это работает, если выходной формат php -vявляется одинаковым для разных версий / сборок.

Для справки, весь вывод был:

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
Мистер Шунц
источник
Этот ответ был великолепен в том смысле, что я могу использовать его для определения версии httpd: P httpd -v | awk '/ ^ Версия сервера / {print $ 3}' | cut -d '/' -f2
The One
143

Расширяя ответ Джеффа Шаллера , полностью пропустите конвейер и просто попросите внутреннее постоянное представление:

$ php -r 'echo PHP_VERSION;'
7.1.15

Вы можете расширить этот шаблон, чтобы получить больше или меньше информации:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Смотрите список предопределенных констант PHP для всех доступных.

Основное преимущество: он не зависит от определенного формата вывода php -v. Учитывая, что он примерно такой же производительности, что и конвейерное решение, он кажется более надежным выбором.


Если ваша цель - проверить версию, вы также можете использовать этот шаблон. Например, этот код завершится, 0если PHP> = 7, а в 1противном случае:

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

Для справки, здесь приведены временные рамки для различных тестовых случаев, сначала упорядоченные быстрее всего:

$ 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
Это действительно единственный правильный ответ. Нет никакой гарантии, что разные сборки PHP будут иметь одинаковый формат выводаphp -v
пушистый
На самом деле это было первое решение, которое пришло мне в голову. Несмотря на то, что попытка разобрать вывод выполняется быстрее, она, вероятно, не так надежна, как компиляция и запуск кода.
Исмаэль Мигель
@IsmaelMiguel Я предполагал обратное: компиляция и выполнение будут быстрее, чем разветвление конвейера. Однако из временных экспериментов я обнаружил, что нет статистической разницы во времени выполнения ни для одного решения.
епископ
1
Ну, у вас есть накладные расходы на выполнение PHP> opcode, opcode> C и C для машинного языка. Эти накладные расходы всегда постоянны. В PHP может быть включен opcache, что значительно сокращает это время. С другой стороны, вы должны порождать процессы и передавать вывод на вход, а что-нет. Я ожидаю, что php будет работать медленнее, если его запускать несколько раз (5-10), по сравнению с анализом вывода. но спасибо за тесты.
Исмаэль Мигель
21

Если вы установили php через менеджер пакетов (например, RPM или yum), вы можете запросить версию оттуда:

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

Кроме того, вы можете попросить php сообщить вам свою версию :

php -r 'echo phpversion();'
Джефф Шаллер
источник
6

Есть разные способы, мне нравится использовать взгляд сзади:

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

или

php -v | grep -Po '(?<=PHP )([0-9.]+)'
Ravexina
источник
второстепенный совет: во втором регулярном выражении нет необходимости; .нормальное значение было бы бесполезным внутри класса символов, поэтому по умолчанию оно уже
считается
вау, это была боль есть ли способ поместить одну обратную косую черту в теги `? удвоение слеша не сработало
user371366
@ dn3s процитируйте шаблон, он работает для меня с одной обратной косой чертой ...
Ravexina
о, я имел в виду, я просто хотел один \ символ, заключенный в теги кода
user371366
Было бы уместно опубликовать комментарий во время голосования «за» ...
Равексина,
5

Поскольку вы начали с awk, вот awkрешение:

$ php -v | awk '/^PHP/{print $2}'
7.2.10
terdon
источник
2
php -v | awk NR==1'{print $2}'

Или

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

источник
1
Вы также можете напечатать только первую строку, сказавawk '{print $2; exit}'
fedorqui
0

Если вы хотите сделать это только с одной передаваемой функцией, вы можете попробовать использовать sed следующим образом:

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

Сначала он удаляет любую строку, которая не начинается с PHP , затем обрезает версию из этой строки, предполагая, что это первая последовательность в форме x.y.z.

Или, если вы хотите что-то более близкое к исходному сценарию, просто поместите ^перед шаблоном grep, чтобы искать только те строки, которые начинаются с PHP:

php -v | grep ^PHP | awk '{print $2}'
Кристиан Гиббонс
источник
Мне нравится, как это работает, просто добавляя ^ перед шаблоном grep. Brilliant.
The One
0

Я думаю, что это более чистое и элегантное решение (должно также работать в Windows):

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

Выход будет как 7.2.24.

Макс Пейн
источник
Похоже, что это в значительной степени основано на unix.stackexchange.com/a/471594/117549 и, возможно, лучше отредактировать другой ответ, включив в него единственную новую часть:.PHP_MINOR_VERSION
Джефф Шаллер