Як отримати лише номер версії 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 дуже проста і елегантна. Спасибі людина.
Один

Відповіді:


13

У моїй системі:

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

як 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}' | вирізати -d '/' -f2
Той

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> опкод, опкод> C і C на машинній мові. Цей наклад завжди є постійним. PHP, можливо, увімкнено opcache, що скорочує цей час на багато. З іншого боку, вам потрібно нерестити процеси та передавати вихідні дані на вхід, а що ні. Я б очікував, що php буде повільнішим, коли запускається кілька разів (5-10), порівняно з розбором результатів. але дякую за тести.
Ісмаїл Мігель


6

Є різні способи, я люблю використовувати погляд за спиною:

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

або

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

незначна підказка: \ є зайвим у другому регулярному виразі; .нормальне значення буде марним всередині класу символів, тому за замовчуванням воно вже трактується як буквальне
user371366

вау, це був біль. Чи є спосіб помістити один зворотний проріз у теги `? подвоєння косої риски не вийшло
користувач371366

@ dn3s цитуйте шаблон, він працює для мене з
односхилим

ой я мав на увазі, я просто хотів, щоб один \ символ укладений у кодові теги
user371366

Опублікувати коментар при голосуванні вниз було б доречно ...
Ravexina

5

Оскільки ви почали з awk, ось awkрішення:

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

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. Блискуча.
Той

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
Jeff Schaller
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.