カール応答状態が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 }'