Wie bekomme ich nur die Versionsnummer von PHP?


15

Ich möchte nur die Version von PHP auf CentOS installiert bekommen.

Ausgabe von 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

Ich habe folgendes versucht:

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

Aber die Ausgabe, die ich bekam, war:

7.1.16
(c)

Wie kann ich nur 7.1.16 bekommen?


7
... | head -1oder es könnte bessere Möglichkeiten geben
LinuxSecurityFreak

Oh, Kopf -1 ist sehr einfach und elegant. Danke, Mann.
The One

Antworten:


13

Auf meinem System:

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

wie grep PHPpasst jeder PHP - String es trifft.

Das ^PHPbedeutet "Nur mit der Zeichenfolge 'PHP' übereinstimmen, wenn sie am Anfang einer Zeile steht".

Dies funktioniert natürlich, wenn das Ausgabeformat von php -vüber Versionen / Builds hinweg konsistent ist.

Als Referenz war die gesamte Ausgabe:

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

Diese Antwort war in einem Sinne großartig, dass ich sie verwenden kann, um auch die Version von httpd zu lesen: P httpd -v | awk '/ ^ Serverversion / {print $ 3}' | cut -d '/' -f2
The One

143

Um die Antwort von Jeff Schaller zu erweitern , überspringen Sie die gesamte Pipeline und fragen Sie nach der internen konstanten Darstellung:

$ php -r 'echo PHP_VERSION;'
7.1.15

Sie können dieses Muster erweitern, um mehr oder weniger Informationen zu erhalten:

$ php -r 'echo PHP_MAJOR_VERSION;'
7

In der PHP-Liste der vordefinierten Konstanten finden Sie alle verfügbaren Konstanten .

Der große Vorteil: Es kommt nicht auf ein definiertes Ausgabeformat von an php -v. Da es ungefähr die gleiche Leistung wie eine Pipeline-Lösung hat, scheint es eine robustere Wahl zu sein.


Wenn Sie die Version testen möchten, können Sie auch dieses Muster verwenden. Dieser Code wird beispielsweise beendet, 0wenn PHP> = 7 ist, und 1ansonsten:

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

Als Referenz finden Sie hier die Timings für verschiedene Testfälle, die am schnellsten sortiert sind:

$ 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
Dies ist wirklich die einzig richtige Antwort. Es gibt keine Garantie, dass verschiedene PHP-Builds dasselbe Ausgabeformat haben fürphp -v
flauschige

Dies war eigentlich die erste Lösung, die mir in den Sinn kam. Der Versuch, die Ausgabe zu analysieren, ist zwar um Welten schneller, aber wahrscheinlich nicht so zuverlässig wie das Kompilieren und Ausführen des Codes.
Ismael Miguel

@IsmaelMiguel Ich hatte das Gegenteil angenommen: kompilieren und ausführen wäre schneller als eine Pipeline abzweigen. Durch Timing-Experimente konnte ich jedoch feststellen, dass es für beide Lösungen keinen statistischen Laufzeitunterschied gibt.
Bischof

1
Nun, Sie müssen PHP> Opcode, Opcode> C und C für die Maschinensprache ausführen. Dieser Aufwand ist immer konstant. In PHP ist möglicherweise Opcache aktiviert, wodurch sich diese Zeit um ein Vielfaches verkürzt. Auf der anderen Seite müssen Sie Prozesse spawnen und die Ausgabe an die Eingabe übergeben und was nicht. Ich würde erwarten, dass PHP langsamer ist, wenn es ein paar Mal ausgeführt wird (5-10), verglichen mit dem Parsen der Ausgabe. aber danke für die tests.
Ismael Miguel


6

Es gibt verschiedene Möglichkeiten, die ich gerne benutze, um nach hinten zu schauen:

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

oder

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

kleiner tipp: das \ ist im zweiten regulären Ausdruck unnötig; .Die normale Bedeutung von 's wäre in einer Zeichenklasse nutzlos, daher wird sie bereits standardmäßig als wörtlich behandelt
user371366

Wow, das war ein Schmerz. Gibt es eine Möglichkeit, einen einzelnen Backslash in Tags einzufügen? Verdoppelung der Schrägstrich hat nicht funktioniert
user371366

@ dn3s zitieren das Muster, es funktioniert für mich mit einem Backslash ...
Ravexina

Oh, ich meinte, ich wollte nur ein einziges Zeichen in Code-Tags eingeschlossen
user371366

Es wäre angebracht, einen Kommentar zu
hinterlassen,

5

awkHier ist eine awkLösung, mit der Sie angefangen haben :

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

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

Oder

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

1
Sie können auch nur die erste Zeile drucken, indem Sie sagenawk '{print $2; exit}'
fedorqui

0

Wenn Sie dies mit nur einer Funktion tun möchten, die weitergeleitet wird, können Sie sed folgendermaßen verwenden:

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

Zuerst werden alle Zeilen gelöscht, die nicht mit "" beginnen PHP. Anschließend wird die Version aus dieser Zeile ausgeschnitten, sofern es sich um die erste Sequenz in Form von "" handelt x.y.z.

Oder, wenn Sie Ihrem ursprünglichen Skript etwas näher kommen möchten, setzen Sie es einfach ^vor Ihr Grep-Muster, um nur nach Zeilen zu suchen, die mit PHP beginnen:

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

Ich mag die Art und Weise, wie es funktionierte, indem ich einfach ^ vor grep pattern hinzufügte. Brillant.
The One
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.