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

asは、遭遇するすべての PHP文字列とgrep 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

この回答は、httpdバージョンのバージョンをgrepするために利用できるという意味で素晴らしいものでした。Phttpd -v | awk '/ ^ Server version / {print $ 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。パイプラインソリューションとほぼ同じパフォーマンスであるため、より堅牢な選択肢のようです。


バージョンをテストすることが目的の場合は、このパターンも使用できます。たとえば、0PHP> = 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
fluffy

これが実際に私の頭に浮かんだ最初の解決策でした。出力を解析しようとするのは世界的には速いですが、おそらくコードをコンパイルして実行するほど信頼性は高くありません。
イスマエルミゲル

@IsmaelMiguel私は反対を推測していました:パイプラインをフォークするよりもコンパイルと実行の方が速いでしょう。しかし、タイミング実験から、どちらのソリューションでも実行時間に統計的な違いはないことがわかりました。
ビショップ

1
さて、PHP>オペコード、オペコード> CおよびCから機械語へのオーバーヘッドがあります。このオーバーヘッドは常に一定です。PHPではopcacheが有効になっている場合があり、これによりこの時間が大幅に短縮されます。一方、プロセスを生成して、出力を入力に渡す必要があります。出力を解析するのに比べて、数回(5〜10回)実行するとphpが遅くなると予想されます。しかし、テストに感謝します。
イスマエルミゲル

21

パッケージマネージャー(RPMやyumなど)を使用してphpをインストールした場合は、そこからバージョンを照会できます。

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

または、phpにバージョンを直接伝えるように依頼することもできます。

php -r 'echo phpversion();'

6

さまざまな方法がありますが、私は後ろを見るのが好きです:

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

または

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

ちょっとしたヒント:2番目の正規表現では\は不要です。.「それはすでにデフォルトでリテラルとして扱われますので、通常の意味は、文字クラス内の役に立たないだろうね
user371366

うわー、それは痛みでした。`タグに単一のバックスラッシュを挿入する方法はありますか?スラッシュを2
回重ねて

@ dn3sはパターンを引用します。単一のバックスラッシュで機能します
...-Ravexina

私は意味ああ、私は1つだけ\コードタグで囲まれた文字たかった
user371366

賛成票を投じながらコメントを投稿するのが適切でしょう...
ラヴェクシーナ

5

で始めたのでawkawk解決策は次のとおりです。

$ 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

1つの関数をパイプするだけでそれを実行したい場合は、次のようにsedを使用してみてください。

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

最初にで始まらない行を削除しPHP、次に、次の形式の最初のシーケンスであると仮定して、その行からバージョンをクリップしますx.y.zます。

または、元のスクリプトにより近いものが必要な場合は、単に^grepパターンの前に置き、PHPで始まる行のみを検索します。

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

grepパターンの前に^を追加するだけで動作する方法が気に入っています。鮮やかさ。
一つの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.