【问题标题】:How can I echo "pass" or "fail" after a bash, curl, grep sequence?如何在 bash、curl、grep 序列之后回显“通过”或“失败”?
【发布时间】:2017-02-13 03:18:36
【问题描述】:

我非常喜欢优雅的单线。我正在尝试编写一个单行测试,在执行 http 请求和搜索后输出“通过”或“失败”。我尝试过这样的事情:

curl "http://haystack.io" | sed 's/.*?needle.*/PASS/' || echo FAIL

...但这并没有正确失败。

也试过了:

curl "http://haystack.io" | if [$(grep -oE "needle") = "needle"]; then echo PASS; else echo FAIL; fi

...但是我的语法不太正确。

我该怎么做?

【问题讨论】:

  • shellcheck.net 是你的朋友——通常,修复它发现的错误是一个很好的起点。
  • 顺便说一句,使用?来修改前面的*是否贪心是PCRE主义;它不适用于 BRE(每个 POSIX 兼容的 sed 默认使用)或 ERE(可以在 GNU 或 BSD sed 中分别使用 -r-E 参数启用)。
  • 试试curl "http://haystack.io" | grep -q needle && echo PASS || echo FAIL。警告:如果标准输出不可写,echo 可能会失败。
  • @alvits,grumble grumble,re:鼓励人们将a && b || c 视为它不是的三元组。 :)
  • @CharlesDuffy - 我完全同意你的观点,但我绝不鼓励 OP。我的建议只是纠正他失败的尝试。鼓励其他读者是无意的:(

标签: bash macos curl sed grep


【解决方案1】:

如果你只是在找针,可以使用grep -q获取退出码:

if curl "http://haystack.io" | grep -q needle
then
  echo "PASS"
else
  echo "FAIL"
fi

你的方法的问题:

curl "http://haystack.io" | sed 's/.*?needle.*/PASS/' || echo FAIL

sed 在表达式有效时总是返回成功,即使替换没有触发。另外,它使用 BRE 而您的正则表达式是 PCRE。

在这个:

curl "http://haystack.io" | if [$(grep -oE "needle") = "needle"]; then echo PASS; else echo FAIL; fi

你缺少引号和空格(shellcheck 会帮助解决这个问题),如果有多个匹配项,它也不起作用。

【讨论】:

  • 非常感谢!我了解了有关退出代码、bash 重定向以及使用echo $? 查找最后一个命令的退出代码的更多信息。绝对需要更多地了解正则表达式风格的细微差别。 :)
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 2012-09-08
  • 2021-03-30
  • 1970-01-01
  • 2015-05-13
  • 2018-01-25
  • 2017-03-31
  • 1970-01-01
相关资源
最近更新 更多