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