केवल php की संस्करण संख्या कैसे प्राप्त करें?


15

मैं CentOS पर स्थापित php का केवल संस्करण प्राप्त करना चाहता हूं।

का आउटपुट 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

जैसा कि हर PHP स्ट्रिंग से grep 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 '/ ^ सर्वर संस्करण / {प्रिंट $ 3}' | cut -d '/' -f2
The One

144

जेफ स्कॉलर के जवाब का विस्तार करते हुए , पाइपलाइन को पूरी तरह से छोड़ दें और बस आंतरिक निरंतर प्रतिनिधित्व के लिए पूछें:

$ 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> opcode, opcode> C और C से मशीन लैंग्वेज करने का ओवरहेड है। यह ओवरहेड हमेशा स्थिर रहता है। PHP में opcache सक्षम हो सकता है, जो इस समय को बहुत कम कर देता है। दूसरी ओर, आपको प्रक्रियाओं को स्पॉन करना होगा और आउटपुट को इनपुट और क्या नहीं। मुझे उम्मीद है कि आउटपुट पार्स करने की तुलना में कुछ समय (5-10) चलने पर php धीमा हो जाएगा। लेकिन परीक्षणों के लिए धन्यवाद।
इस्माइल मिगुएल

21

यदि आपने संकुल प्रबंधक (उदाहरण RPM या यम) के माध्यम से php स्थापित किया है, तो आप वहां से संस्करण की क्वेरी कर सकते हैं:

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

वैकल्पिक रूप से, आप सीधे इसका संस्करण बताने के लिए php से पूछ सकते हैं :

php -r 'echo phpversion();'

6

वहाँ अलग अलग तरीके हैं, मैं पीछे देखो का उपयोग करना चाहते हैं:

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

या

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

मामूली टिप: दूसरा रेगेक्स में अनावश्यक है; .एक चरित्र वर्ग के अंदर सामान्य अर्थ बेकार होगा, इसलिए इसे पहले से ही डिफ़ॉल्ट रूप से शाब्दिक माना जाता है
user371366

वाह, यह एक दर्द था। वहाँ `टैग में एक एकल backslash डाल करने के लिए कोई रास्ता नहीं है? स्लैश को दोगुना करने से काम नहीं चला
user371366

@ dn3s पैटर्न को कोट करते हैं, यह मेरे लिए सिंगल
बैकलैश के

ओह, मेरा मतलब है, मैं सिर्फ एक एकल वर्ण चाहता था जो कोड टैग में संलग्न है
user371366

नीचे वोट देते समय एक टिप्पणी पोस्ट करना उचित होगा ...
रवेक्सिना

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}'
फेडोरक्वि सिप २ at ’१16

0

यदि आप इसे केवल एक ही फंक्शन पाइप के साथ करना चाहते हैं, तो आप इस तरह से sed का उपयोग करके देख सकते हैं:

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

सबसे पहले यह किसी भी लाइन को हटाता है जो इसके साथ शुरू नहीं होता है PHP, फिर यह उस लाइन से संस्करण को क्लिप करता है मान लें कि यह फॉर्म के रूप में पहला अनुक्रम है x.y.z

या, यदि आप अपनी मूल स्क्रिप्ट के करीब कुछ करना चाहते हैं, तो बस ^अपने grep पैटर्न के सामने रखें जो केवल उन रेखाओं के लिए देख सकते हैं जो उन भाषाओं के साथ हैं:

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

मुझे यह पसंद है कि यह सिर्फ grep पैटर्न के सामने ^ जोड़कर काम करता है। प्रतिभाशाली।
एक

0

मुझे लगता है कि यह अधिक स्वच्छ और सुरुचिपूर्ण समाधान है (विंडोज में भी काम करना चाहिए):

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

आउटपुट जैसा होगा 7.2.24


यह भारी के आधार पर किया जा रहा है unix.stackexchange.com/a/471594/117549 :, और कहा कि अन्य जवाब देने के लिए एक संपादन के रूप में शायद बेहतर है, केवल नए हिस्से शामिल करने के लिए.PHP_MINOR_VERSION
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.