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'는 라인의 시작입니다 일치".

분명히 이것은 출력 형식이 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하기 위해 활용할 수도 있다는 점에서 훌륭했습니다. : P httpd -v | awk '/ ^ 서버 버전 / {print $ 3}'| cut -d '/'
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

이것은 실제로 내 머리에 온 첫 번째 해결책이었습니다. 출력을 구문 분석하는 것이 세계에서 더 빠르지 만 코드를 컴파일하고 실행하는 것만 큼 신뢰할 수는 없습니다.
Ismael Miguel

@IsmaelMiguel 나는 정반대로 가정했다 : 파이프 라인을 포크하는 것보다 컴파일과 실행이 빠를 것이다. 그러나 타이밍 실험에서 두 솔루션의 런타임에 통계적 차이가 없다는 것을 알았습니다.
주교

1
글쎄, PHP> opcode, opcode> C 및 C를 기계 언어로 수행하는 오버 헤드가 있습니다. 이 오버 헤드는 항상 일정합니다. PHP가 opcache를 활성화했을 수 있으므로 이번에는 시간이 많이 단축됩니다. 반면에 프로세스를 생성하고 출력을 입력 및 기타로 전달해야합니다. 출력을 구문 분석하는 것과 비교하여 몇 번 (5-10) 실행하면 PHP가 느려질 것으로 예상합니다. 테스트 해 주셔서 감사합니다.
Ismael Miguel


6

뒤에 다른 방법을 사용하고 싶습니다.

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

또는

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

작은 팁 : \는 두 번째 정규 표현식에서 필요하지 않습니다. .이미 기본적으로 리터럴로 취급 그래서 '보통의 의미는, 문자 클래스 내부에 쓸모가있을 것 s의
user371366

와우, 그것은 고통이었다. `태그에 단일 백 슬래시를 넣을 수있는 방법이 있습니까? 슬래시를 두 배로
늘려도

@ dn3s 패턴을 인용, 그것은 단일 백 슬래시와 함께 나를 위해 작동 ...
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}'
말하면

0

파이프되는 단일 함수로만 수행하려면 다음과 같이 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 패턴 앞에 ^를 추가하여 작동하는 방식이 마음에 듭니다. 훌륭한.
하나의

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.