在bash,curl,grep序列之后,我如何回应“通过”或“失败”?

时间:2016-10-04 20:20:27

标签: bash macos curl sed grep

我是优雅单行的忠实粉丝。我正在尝试编写一个单行测试,在执行http请求和搜索后输出“pass”或“fail”。我尝试过这样的事情:

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

...但我无法正确理解语法。

我该怎么做?

1 个答案:

答案 0 :(得分:5)

如果您只是寻找针头,可以使用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会有所帮助),如果有多个匹配,它也无法正常工作。