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 不支持三元运算符?

是否有一个简单的衬垫可以在不创建 shell 脚本的情况下完成此操作? (我的也grep ' 200 '很松散,但我想稍后可以更具体)

答案1

就像快速研究grep手册页应该揭示的那样,它允许选项、搜索模式(如果指定多个选项则有多个模式-e)和可选的文件名列表,如果没有,则像许多其他 Unix 过滤器一样返回到读取标准输入指定文件名。没有关于三元运算符的任何内容。

如果它如果支持的话,它可能需要成为 shell 的一个功能,但据我所知,没有一个 shell 支持这样的功能。它还会与通配符元字符的语法发生冲突,?通配符元字符(单独地)与任何单字符文件名匹配。

Bourne 兼容 shell 中常见的简写习惯看起来像

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 问题。您可能正在寻找一种可靠的编程方法来检查curl是否成功。为此,您应该添加-f

curl -fqI http://www.example.com

如果成功则以代码 0 退出,如果任何类型的失败(包括成功完成 HTTP 会话但报告 HTTP 错误的服务器错误),则以非零代码退出。例如,在 shell 脚本中,$?如果要将退出代码存储在变量中,则可以在命令后立即访问此退出代码,或者使用 shell 的//if有条件地执行其他代码:&&||

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

如果目标确实只是打印成功/不成功,则大多数 shell 都可以选择自动显示非零退出代码;例如,在 zsh 和setopt printexitvaluein your 中~/.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. 在curl上设置“silent”和“quiet”标志,并将实际响应重定向到带有 的位桶-o /dev/null。这会停止所有的curl输出,这让我们可以专注于我们的猎物,即状态代码。 (这-I是对服务器的礼貌:无论如何我们都会丢弃响应,因此我们只请求响应的标头)
  2. 要求curl 输出带有-w '%{http_code}'标志的响应代码。
  3. 使用语法捕获单个字符串中的所有输出"$()",并在前面添加字母 x 以确保字符串中始终有某些内容,即使命令崩溃并烧毁(旧习惯很难改掉)。此时正确的做法是检查curl命令的返回代码,但由于现在任何失败都会整齐地映射到“不是200”结果,因此我们不会打扰。
  4. 使用[命令(通常位于/bin/[,通常是到 的符号链接/bin/test)检查结果字符串是否与“x200”相同
  5. 现在我们已经有了布尔值,但由于问题要求“字符串布尔值”,最终用于if选择要输出的内容。的实际语法if可能因不同的 shell 而异;这个人将与sh以及bash他们的亲戚一起工作。

相关内容