Bagaimana cara mendapatkan hanya nomor versi php?


15

Saya hanya ingin menginstal versi php di CentOS.

Output dari 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

Saya mencoba yang berikut ini:

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

Tapi output yang saya dapatkan adalah:

7.1.16
(c)

Bagaimana saya bisa mendapatkan 7.1.16 saja?


7
... | head -1atau mungkin ada cara yang lebih baik
LinuxSecurityFreak

Oh, head -1 sangat sederhana dan elegan. Terima kasih sobat.
The One

Jawaban:


13

Di sistem saya:

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

sebagai grep PHPcocok setiap string PHP itu pertemuan.

The ^PHPberarti "cocok hanya string 'PHP' ketika pada awal baris".

Jelas, ini berfungsi jika format output php -vkonsisten di seluruh versi / build.

Untuk referensi, seluruh output adalah:

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

Jawaban ini sangat bagus dalam arti bahwa saya dapat menggunakannya untuk menangkap versi versi httpd juga: P httpd -v | awk '/ ^ Versi server / {print $ 3}' | cut -d '/' -f2
The One

143

Memperluas jawaban Jeff Schaller , lewati pipeline sama sekali dan hanya meminta representasi konstanta internal:

$ php -r 'echo PHP_VERSION;'
7.1.15

Anda dapat memperluas pola ini untuk mendapatkan lebih banyak, atau kurang, informasi:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Lihat daftar PHP dari konstanta yang telah ditentukan sebelumnya untuk semua yang tersedia.

Manfaat utama: tidak bergantung pada format output yang ditentukan php -v. Mengingat itu tentang kinerja yang sama dengan solusi pipa, maka tampaknya pilihan yang lebih kuat.


Jika tujuan Anda adalah untuk menguji versi, maka Anda juga dapat menggunakan pola ini. Misalnya, kode ini akan keluar 0jika PHP> = 7, dan 1sebaliknya:

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

Untuk referensi, berikut adalah pengaturan waktu untuk berbagai kasus pengujian, yang dipesan terlebih dahulu tercepat:

$ 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
Ini benar-benar satu-satunya jawaban yang benar. Tidak ada jaminan bahwa versi PHP yang berbeda akan memiliki format keluaran yang sama untukphp -v
fluffy

Ini sebenarnya solusi pertama yang datang ke kepalaku. Saat mencoba mem-parsing output lebih cepat, mungkin tidak dapat diandalkan seperti mengkompilasi kode dan menjalankannya.
Ismael Miguel

@IsmaelMiguel Saya telah menduga sebaliknya: kompilasi dan eksekusi akan lebih cepat daripada garpu pipa. Namun saya menemukan dari percobaan waktu bahwa tidak ada perbedaan statistik dalam run-time untuk kedua solusi.
Uskup

1
Nah, Anda memiliki overhead untuk melakukan PHP> opcode, opcode> C dan C ke bahasa mesin. Overhead ini selalu konstan. PHP mungkin mengaktifkan opcache, yang mempersingkat waktu ini. Di sisi lain, Anda harus menelurkan proses dan meneruskan output ke input dan apa-tidak. Saya berharap php menjadi lebih lambat ketika dijalankan beberapa kali (5-10), dibandingkan dengan parsing output. tapi terima kasih untuk tesnya.
Ismael Miguel


6

Ada berbagai cara, saya suka menggunakan tampilan di belakang:

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

atau

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

tip minor: \ tidak diperlukan di regex kedua; .Makna normal akan menjadi tidak berguna di dalam kelas karakter, jadi itu sudah diperlakukan sebagai literal secara default
user371366

wow, itu menyebalkan. apakah ada cara untuk meletakkan backslash tunggal dalam tag `? menggandakan slash tidak berfungsi
user371366

@ dn3s mengutip polanya, itu bekerja untuk saya dengan backslash tunggal ...
Ravexina

oh
maksudku

Posting komentar sambil memberikan suara akan tepat ...
Ravexina

5

Sejak Anda mulai awk, inilah awksolusinya:

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

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

Atau

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

1
Anda juga dapat mencetak hanya baris pertama dengan mengatakanawk '{print $2; exit}'
fedorqui

0

Jika Anda ingin melakukannya hanya dengan satu fungsi saja yang sedang disalurkan, Anda dapat mencoba menggunakan sed seperti ini:

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

Pertama menghapus baris yang tidak dimulai PHP, kemudian klip versi dari baris itu dengan asumsi itu adalah urutan pertama dalam bentuk x.y.z.

Atau, jika Anda ingin sesuatu yang lebih dekat dengan skrip asli Anda, cukup letakkan ^di depan pola grep Anda untuk hanya mencari baris yang dimulai dengan PHP:

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

Saya suka cara kerjanya dengan hanya menambahkan ^ di depan pola grep. Cemerlang.
The One

0

Saya pikir ini solusi yang lebih bersih dan elegan (juga harus bekerja di Windows):

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

Outputnya akan seperti 7.2.24.


Ini tampaknya sangat didasarkan pada unix.stackexchange.com/a/471594/117549 , dan mungkin lebih baik sebagai edit untuk jawaban yang lain, untuk memasukkan satu-satunya bagian baru:.PHP_MINOR_VERSION
Jeff Schaller
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.