Grep 삼항 컬 응답 [중복]

Grep 삼항 컬 응답 [중복]

컬 응답 상태가 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 printexitvalueyours에서는 ~/.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

그것을 파괴:

  1. 컬에 "silent" 및 "quiet" 플래그를 설정하고 -o /dev/null. 이렇게 하면 모든 컬 출력이 중지되어 우리가 먹이인 상태 코드에 집중할 수 있습니다. (이것은 -I서버에 대한 배려입니다. 어쨌든 응답을 삭제하므로 응답 헤더만 요청합니다.)
  2. -w '%{http_code}'플래그와 함께 응답 코드를 출력하도록 컬에게 요청하세요 .
  3. 구문을 사용하여 모든 출력을 단일 문자열로 캡처 "$()"하고 x 문자를 앞에 추가하여 명령이 충돌하거나 손상되더라도 문자열에 항상 무언가가 있도록 합니다(오래된 습관은 어렵습니다). 이 시점에서 해야 할 올바른 일은 컬 명령의 반환 코드를 확인하는 것입니다. 그러나 모든 실패는 이제 "200이 아닌" 결과로 깔끔하게 매핑되므로 신경쓰지 않겠습니다.
  4. [명령(일반적 /bin/[으로 에 대한 심볼릭 링크 )을 사용하여 /bin/test결과 문자열이 "x200"과 동일한지 확인합니다.
  5. 이제 우리는 이미 부울을 가지고 있지만 질문에서 "문자열 부울"을 요구했기 때문에 이는 궁극적으로 if출력할 항목을 선택하는 데 사용됩니다. 의 실제 구문은 if쉘마다 다를 수 있습니다. 이 구문은 해당 쉘에서도 작동 sh합니다 .bash

관련 정보