วิธีรับเฉพาะหมายเลขเวอร์ชันของ 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

เป็น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

คำตอบนี้ยอดเยี่ยมในแง่ที่ฉันสามารถใช้เพื่อ grep รุ่นของ httpd รุ่นเกินไป: P httpd -v | awk '/ ^ รุ่นเซิร์ฟเวอร์ / {พิมพ์ $ 3}' | cut -d '/' -f2
The One

143

ขยายคำตอบของ Jeff Schallerข้ามไปป์ไลน์ทั้งหมดแล้วขอการแทนค่าคงที่ภายใน:

$ 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
ปุย

นี่เป็นทางออกแรกที่มาถึงฉัน ในขณะที่พยายามแยกวิเคราะห์ผลลัพธ์เป็นโลกที่เร็วขึ้น แต่ก็อาจไม่น่าเชื่อถือเท่าที่รวบรวมรหัสและเรียกใช้
Ismael Miguel

@ IsmaelMiguel ฉันได้สันนิษฐานตรงกันข้าม: รวบรวมและรันจะเร็วกว่าทางแยก อย่างไรก็ตามฉันพบจากการทดสอบเวลาที่ไม่มีความแตกต่างทางสถิติในเวลาทำงานสำหรับวิธีการแก้ปัญหาอย่างใดอย่างหนึ่ง
อธิการ

1
คุณมีค่าใช้จ่ายในการทำ PHP> opcode, opcode> C และ C เป็นภาษาเครื่อง ค่าใช้จ่ายนี้คงที่เสมอ PHP อาจเปิดใช้งาน opcache ซึ่งทำให้เวลานี้สั้นลงมาก ในอีกทางหนึ่งคุณต้องวางไข่กระบวนการและส่งออกไปยังอินพุตและอะไร ฉันคาดหวังว่า php จะช้าลงเมื่อใช้งานสองสามครั้ง (5-10) เมื่อเทียบกับการแยกวิเคราะห์เอาต์พุต แต่ขอบคุณสำหรับการทดสอบ
Ismael Miguel


6

มีหลายวิธีที่ฉันชอบใช้ดู:

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

หรือ

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

เคล็ดลับเล็กน้อย: \ ไม่จำเป็นใน regex ที่สอง; .ความหมายปกติของมันจะไร้ประโยชน์ในคลาสตัวละครดังนั้นมันจึงถูกใช้เป็นตัวอักษรตามค่าเริ่มต้น
371366

ว้าวนั่นเป็นความเจ็บปวด มีวิธีใดที่จะใส่แบ็กสแลชเดี่ยวในแท็ก ` การเพิ่มเครื่องหมายทับสองครั้งไม่ทำงาน
user371366

@ dn3s พูดรูปแบบการทำงานสำหรับฉันด้วย backslash เดียว ...
Ravexina

โอ้ฉันหมายความว่าฉันแค่ต้องการตัวอักษร \ หนึ่งตัวที่อยู่ในแท็กรหัส
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/'

ครั้งแรกมันลบบรรทัดใด ๆ ที่ไม่ได้เริ่มต้นด้วยแล้วมันคลิปรุ่นจากบรรทัดว่าสมมติว่ามันเป็นลำดับแรกในรูปแบบของPHPx.y.z

หรือถ้าคุณต้องการบางสิ่งที่ใกล้เคียงกับสคริปต์ต้นฉบับของคุณเพียงวางไว้^ข้างหน้ารูปแบบ grep ของคุณเพื่อค้นหาเฉพาะบรรทัดที่ขึ้นต้นด้วย PHP:

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

ฉันชอบวิธีการทำงานของมันโดยเพิ่ม ^ ไว้ด้านหน้ารูปแบบ grep สุกใส
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
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.