Làm thế nào để chỉ lấy số phiên bản của php?


15

Tôi muốn chỉ nhận phiên bản php được cài đặt trên CentOS.

Đầu ra của 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

Tôi đã thử điều này như sau:

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

Nhưng đầu ra tôi nhận được là:

7.1.16
(c)

Làm thế nào tôi có thể chỉ nhận được 7.1.16?


7
... | head -1hoặc có thể có những cách tốt hơn
LinuxSecurityFreak

Ồ, đầu -1 rất đơn giản và thanh lịch. Cảm ơn người đàn ông.
Một

Câu trả lời:


13

Trên hệ thống của tôi:

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

như grep PHPkhớp với mọi chuỗi PHP mà nó gặp.

Nghĩa ^PHPlà "chỉ khớp với chuỗi 'PHP' khi nó ở đầu dòng".

Rõ ràng, điều này hoạt động nếu định dạng đầu ra php -vlà nhất quán giữa các phiên bản / bản dựng.

Để tham khảo, toàn bộ đầu ra là:

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

Câu trả lời này rất hay theo nghĩa là tôi có thể sử dụng nó để grep phiên bản của phiên bản httpd: P httpd -v | awk '/ ^ Phiên bản máy chủ / {in $ 3}' | cắt -d '/' -f2
Một

143

Mở rộng câu trả lời của Jeff Schaller , bỏ qua đường ống hoàn toàn và chỉ yêu cầu biểu diễn hằng số nội bộ:

$ php -r 'echo PHP_VERSION;'
7.1.15

Bạn có thể mở rộng mẫu này để có thêm thông tin hoặc ít hơn:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

Xem danh sách PHP của các hằng số được xác định trước cho tất cả có sẵn.

Lợi ích chính: nó không dựa vào định dạng đầu ra được xác định là php -v. Với hiệu suất tương đương với giải pháp đường ống, thì có vẻ như đó là một lựa chọn mạnh mẽ hơn.


Nếu mục tiêu của bạn là kiểm tra phiên bản, thì bạn cũng có thể sử dụng mẫu này. Ví dụ: mã này sẽ thoát 0nếu PHP> = 7 và 1nếu không:

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

Để tham khảo, đây là thời gian cho các trường hợp thử nghiệm khác nhau, được đặt hàng nhanh nhất trước tiên:

$ 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
Đây thực sự là câu trả lời đúng duy nhất. Không có gì đảm bảo rằng các bản dựng khác nhau của PHP sẽ có cùng định dạng đầu ra chophp -v
fluffy

Đây thực sự là giải pháp đầu tiên xuất hiện trong đầu tôi. Trong khi cố gắng phân tích đầu ra là thế giới nhanh hơn, có lẽ nó không đáng tin cậy bằng việc biên dịch mã và chạy nó.
Ismael Miguel

@IsmaelMiguel Tôi đã đoán ngược lại: biên dịch và thực thi sẽ nhanh hơn so với fork một đường ống. Tuy nhiên tôi đã tìm thấy từ các thí nghiệm thời gian rằng không có sự khác biệt thống kê về thời gian chạy cho cả hai giải pháp.
giám mục

1
Chà, bạn có toàn bộ chi phí để thực hiện PHP> opcode, opcode> C và C thành ngôn ngữ máy. Chi phí này luôn không đổi. PHP có thể đã kích hoạt opcache, rút ​​ngắn thời gian này rất nhiều. Mặt khác, bạn phải sinh ra các quy trình và chuyển đầu ra cho đầu vào và những gì không. Tôi hy vọng php sẽ chậm hơn khi chạy một vài lần (5-10), so với phân tích cú pháp đầu ra. nhưng cảm ơn bạn đã kiểm tra
Ismael Miguel


6

Có nhiều cách khác nhau, tôi thích sử dụng nhìn phía sau:

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

hoặc là

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

mẹo nhỏ: \ không cần thiết trong regex thứ hai; .Ý nghĩa bình thường của nó sẽ vô dụng trong một lớp nhân vật, do đó, nó được coi là theo nghĩa đen theo mặc định
user371366

wow, đó là một nỗi đau. Có cách nào để đặt một dấu gạch chéo ngược trong các thẻ `không? nhân đôi dấu gạch chéo không hoạt động
user371366

@ dn3s trích dẫn mẫu, nó hoạt động với tôi với dấu gạch chéo đơn ...
Ravexina

ồ, ý tôi là, tôi chỉ muốn một ký tự \ được bao trong các thẻ mã
user371366

Đăng một bình luận trong khi bỏ phiếu xuống sẽ thích hợp ...
Ravexina

5

Vì bạn đã bắt đầu với awk, đây là một awkgiải pháp:

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

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

Hoặc là

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

1
Bạn cũng có thể chỉ in dòng đầu tiên bằng cách nóiawk '{print $2; exit}'
fedorqui

0

Nếu bạn muốn làm điều đó chỉ với một chức năng duy nhất, bạn có thể thử sử dụng sed như thế này:

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

Đầu tiên, nó xóa bất kỳ dòng nào không bắt đầu PHP, sau đó nó cắt phiên bản từ dòng đó giả sử đó là chuỗi đầu tiên ở dạng x.y.z.

Hoặc, nếu bạn muốn một cái gì đó gần hơn với tập lệnh gốc của mình, chỉ cần đặt ^ở phía trước mẫu grep của bạn để chỉ tìm các dòng bắt đầu bằng PHP:

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

Tôi thích cách nó hoạt động bằng cách thêm ^ vào trước mẫu grep. Xuất sắc.
Một
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.