![Grep 삼항 컬 응답 [중복]](https://linux55.com/image/109850/Grep%20%EC%82%BC%ED%95%AD%20%EC%BB%AC%20%EC%9D%91%EB%8B%B5%20%5B%EC%A4%91%EB%B3%B5%5D.png)
컬 응답 상태가 200인 경우 부울 값을 반환하려고 합니다.
curl https://www.example.com -I | grep ' 200 ' ? echo '1' : echo '0';
그러나 이로 인해 다음이 발생합니다.
grep: ?: No such file or directory
grep: echo: No such file or directory
grep: 1: No such file or directory
grep: :: No such file or directory
grep: echo: No such file or directory
grep: 0: No such file or directory
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0
그래서 (그리고 다른 스레드를 읽음으로써) grep이 삼항 연산자를 지원하지 않는지 궁금합니다.
쉘 스크립트를 작성하지 않고 이를 수행할 수 있는 간단한 라이너가 있습니까? (내 것도 grep ' 200 '
꽤 느슨하지만 나중에 더 구체적으로 설명할 수 있을 것 같아요)
답변1
grep
매뉴얼 페이지를 빠르게 살펴보면 옵션, 검색 모드(여러 옵션이 지정된 경우 다중 모드 -e
) 및 선택적 파일 이름 목록이 허용되며, 없으면 표준 입력에서 지정된 파일 이름을 읽습니다. 삼항 연산자에 대해서는 아무것도 없습니다.
그 경우예지원된다면 쉘의 기능이어야 할 수도 있지만, 내가 아는 한 그러한 기능을 지원하는 쉘은 없습니다. 또한 ?
단일 문자 파일 이름과 일치하는 와일드카드 메타 문자 구문과도 충돌합니다 .
Bourne 호환 쉘의 일반적인 속기 규칙은 다음과 같습니다.
curl https://www.example.com/ -I | grep -q ' 200 ' && echo 1 || echo 0
이는 출력의 다른 곳에서 실수로 "200"과 일치할 수 있습니다. 정확도를 높이려면 일치 작업의 정밀도를 높이 curl https://www.example.com/ -I | head -1 | grep ' 200 '
거나 크게 높이십시오.curl https://www.example.com/ -I | awk 'NR==1 { print ($2=="200" ? "1" : "0"); exit }'
여담이지만 잘못된 URL이나 기타 예상치 못한 오류가 발생하는 경우 "0"을 인쇄하고 싶다면 기본 출력을 0으로 설정하고 200이 보이면 1로 변경한 후 마지막에 최종 결과를 인쇄하면 됩니다.
curl https://www.example.com/ -I |
awk 'BEGIN { s=0 } NR==1 { s=($2=="200"); exit } END { print s }'
답변2
다른 모든 답변은 제안된 솔루션에 대해 논의하며 이것이 XY 문제라고 제안하고 싶습니다. 컬이 성공했는지 확인하는 신뢰할 수 있는 프로그래밍 방식을 찾고 있을 수 있습니다. 이렇게 하려면 다음을 추가해야 합니다 -f
.
curl -fqI http://www.example.com
성공 시 코드 0으로 종료하거나 모든 종류의 실패(HTTP 세션을 성공적으로 완료했지만 HTTP 오류를 보고한 서버 오류 포함) 시 0이 아닌 코드로 종료합니다. 예를 들어, 셸 스크립트에서 $?
종료 코드를 변수에 저장하려는 경우 명령 바로 다음에 이 종료 코드에 액세스하거나 if
셸의 //를 사용하여 조건부로 다른 코드를 실행할 수 있습니다.&&
||
if curl -fqI http://www.example.com
then echo 1
else echo 0
fi
실제로 목표가 성공/실패를 인쇄하는 것이라면 대부분의 쉘에는 0이 아닌 종료 코드를 자동으로 표시하는 옵션이 있습니다. 예를 들어 zsh 및 setopt printexitvalue
yours에서는 ~/.zshrc
다음과 같은 내용이 표시됩니다(흥미로운 강조 표시를 위해 컬 출력을 억제함). 부분):
% curl -fqI http://www.example.com >/dev/null 2>&1
% curl -fqI http://www.aoeuaoeuaoeuaoeu.com >/dev/null 2>&1
zsh: exit 6 curl -fqI http://www.aoeuaoeuaoeuaoeu.com > /dev/null 2>&1
답변3
! curl https://www.example.com -I | grep -q ' 200 '; echo "$?"
! curl https://www.example.com -I | grep -q ' 200 '; yes "$?" | sed q
답변4
나는 이것을 할 수 있다:
if [ "x$(curl -Isqw '%{http_code}' -o /dev/null http://example.com/)" = 'x200' ]; then echo "yep"; else echo "nope"; fi
그것을 파괴:
- 컬에 "silent" 및 "quiet" 플래그를 설정하고
-o /dev/null
. 이렇게 하면 모든 컬 출력이 중지되어 우리가 먹이인 상태 코드에 집중할 수 있습니다. (이것은-I
서버에 대한 배려입니다. 어쨌든 응답을 삭제하므로 응답 헤더만 요청합니다.) -w '%{http_code}'
플래그와 함께 응답 코드를 출력하도록 컬에게 요청하세요 .- 구문을 사용하여 모든 출력을 단일 문자열로 캡처
"$()"
하고 x 문자를 앞에 추가하여 명령이 충돌하거나 손상되더라도 문자열에 항상 무언가가 있도록 합니다(오래된 습관은 어렵습니다). 이 시점에서 해야 할 올바른 일은 컬 명령의 반환 코드를 확인하는 것입니다. 그러나 모든 실패는 이제 "200이 아닌" 결과로 깔끔하게 매핑되므로 신경쓰지 않겠습니다. [
명령(일반적/bin/[
으로 에 대한 심볼릭 링크 )을 사용하여/bin/test
결과 문자열이 "x200"과 동일한지 확인합니다.- 이제 우리는 이미 부울을 가지고 있지만 질문에서 "문자열 부울"을 요구했기 때문에 이는 궁극적으로
if
출력할 항목을 선택하는 데 사용됩니다. 의 실제 구문은if
쉘마다 다를 수 있습니다. 이 구문은 해당 쉘에서도 작동sh
합니다 .bash