Nasıl php sürüm numarasını almak için?


15

Sadece CentOS yüklü php sürümünü almak istiyorum.

Çıktı 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

Aşağıdaki denedim:

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

Ama elde ettiğim çıktı:

7.1.16
(c)

Nasıl sadece 7.1.16 alabilirim?


7
... | head -1ya da daha iyi yollar olabilir
LinuxSecurityFreak

Oh, kafa -1 çok basit ve zarif. Teşekkürler dostum.
Bir

Yanıtlar:


13

Sistemimde:

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

olarak grep PHPmaçları her karşılaştığı PHP dize.

^PHPVasıta "Yalnızca dize 'PHP' bir satırın başında ise maç".

Açıkçası, bu, çıktı biçimi php -vsürümler / derlemeler arasında tutarlıysa çalışır .

Referans için, tüm çıktı:

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

Bu cevap ben de httpd sürümü sürümünü grep kullanmak bir anlamda harikaydı: P httpd -v | awk '/ ^ Sunucu sürümü / {print $ 3}' | cut -d '/' -f2
Bir

144

Jeff Schaller'in cevabını genişleterek , boru hattını tamamen atlayın ve sadece dahili sabit temsili isteyin:

$ php -r 'echo PHP_VERSION;'
7.1.15

Daha fazla veya daha az bilgi almak için bu kalıbı genişletebilirsiniz:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Kullanılabilenler için önceden tanımlanmış sabitlerin PHP listesine bakın .

En büyük yararı: tanımlı bir çıktı biçimine bağlı değildir php -v. Bir boru hattı çözümü ile yaklaşık aynı performans göz önüne alındığında, daha sağlam bir seçim gibi görünüyor.


Hedefiniz sürümü test etmekse, bu deseni de kullanabilirsiniz. Örneğin, 0PHP> = 7 ise bu koddan çıkılacak , 1aksi takdirde:

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

Referans için, aşağıda en hızlı sipariş edilen çeşitli test durumları için zamanlamalar şunlardır:

$ 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
Bu gerçekten tek doğru cevap. Farklı PHP yapılarının aynı çıktı biçimine sahip olacağının garantisi yokturphp -v
kabarık

Bu aslında aklıma gelen ilk çözümdü. Çıktıyı ayrıştırmaya çalışırken dünyalar daha hızlıdır, muhtemelen kodu derlemek ve çalıştırmak kadar güvenilir değildir.
Ismael Miguel

@IsmaelMiguel Ben tam tersini varsaymıştım: derlemek ve yürütmek bir boru hattı çatal daha hızlı olurdu. Ancak zamanlama deneylerinden her iki çözüm için de çalışma süresinde istatistiksel bir fark olmadığını buldum.
fil

1
Makine diline PHP> opcode, opcode> C ve C yapma yükünüz var. Bu yük daima sabittir. PHP'de opcache etkinleştirilmiş olabilir, bu da bu zamanı çok kısaltır. Öte yandan, süreçleri ortaya çıkarmalı ve çıktıyı girdi ve neye vermemelisiniz. Ben çıktı ayrıştırma karşılaştırıldığında, birkaç kez (5-10) koştu php daha yavaş olmasını beklenir. ama testler için teşekkür ederim.
Ismael Miguel

21

Php'yi paket yöneticisi (ör. RPM veya yum) aracılığıyla yüklediyseniz, sürümü buradan sorgulayabilirsiniz:

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

Alternatif olarak, php'nin sürümünü doğrudan anlatmasını isteyebilirsiniz :

php -r 'echo phpversion();'

6

Farklı yollar var, arkasına bakmayı seviyorum:

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

veya

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

küçük ipucu: \ ikinci regex 'de gereksizdir; .'in normal anlamı bir karakter sınıfı içinde işe yaramaz, bu yüzden zaten varsayılan olarak değişmez olarak ele alınır
user371366

vay, bu bir acıydı. etiketlerine tek ters eğik çizgi koymanın bir yolu var mı? eğik çizgi iki katına çıkmadı
user371366

@ dn3s desen alıntı, benim için tek ters eğik çizgi ile çalışır ...
Ravexina

ah demek istediğim, sadece kod etiketleri içine alınmış tek bir \ karakter istedim
user371366 27:18

Aşağı oy verirken yorum
yayınlamak

5

Başladığınızdan beri awk, işte bir awkçözüm:

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

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

Veya

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

1
Ayrıca söyleyerek sadece ilk satırı yazdırabilirsinizawk '{print $2; exit}'
fedorqui

0

Sadece tek bir işlev boruyla yapılıyorsa, sed'i aşağıdaki gibi kullanmayı deneyebilirsiniz:

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

İlk olarak PHP, başlamayan herhangi bir satırı siler , ardından biçimini ilk sıra olarak kabul ederek sürümü bu satırdan kırpır x.y.z.

Veya orijinal betiğinize daha yakın bir şey istiyorsanız, yalnızca ^PHP ile başlayan satırları aramak için grep deseninizin önüne koyun :

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

Ben sadece grep desen önünde ^ ekleyerek çalışma şeklini seviyorum. Parlak.
Bir

0

Bunun daha temiz ve zarif bir çözüm olduğunu düşünüyorum (Windows'ta da çalışmalıdır):

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

Çıktı gibi olurdu 7.2.24.


Bu büyük ölçüde unix.stackexchange.com/a/471594/117549'a dayanıyor gibi görünüyor ve belki de yeni cevabı eklemek için bu diğer cevaba bir düzenleme olarak daha iyi:.PHP_MINOR_VERSION
Jeff Schaller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.