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エラーを報告したサーバーエラーを含む)の場合はゼロ以外のコードで終了します。たとえば、シェルスクリプトで$?終了コードを変数に保存する場合は、コマンドの直後にこの終了コードにアクセスしたり、ifシェルの // を使用して条件付きで別のコードを実行したりできます。&&||

if curl -fqI http://www.example.com
then echo 1
else echo 0
fi

実際、目標が成功/失敗を印刷することである場合、ほとんどのシェルにはゼロ以外の終了コードを自動的に表示するオプションがあります。たとえば、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

関連情報