作为此脚本的一部分,我需要能够检查给定的第一个参数是否与文件的第一个单词匹配。如果是,则退出并显示错误消息;如果没有,请将参数附加到文件中。我了解如何编写if语句,但不了解如何grep在脚本中使用。我知道这grep看起来像这样
grep ^$1 schemas.txt
Run Code Online (Sandbox Code Playgroud)
我觉得这应该比我做的要容易得多。
我在声明中收到错误“参数太多” if。我摆脱了之间的空间grep -q,然后得到了一个预期的错误二元运算符。
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
Run Code Online (Sandbox Code Playgroud)
der*_*ert 285
grep如果找到了一些东西(零)与没有找到任何东西(非零),则返回不同的退出代码。在if语句中,零退出代码映射为“true”,非零退出代码映射为 false。另外,grep 有一个-q参数不输出匹配的文本(而只返回退出状态码)
因此,您可以像这样使用 grep:
if grep -q PATTERN file.txt; then
echo found
else
echo not found
fi
Run Code Online (Sandbox Code Playgroud)
快速说明一下,当您执行诸如 之类的操作时if [ -z "$var" ]…,事实证明它[实际上是您正在运行的命令,就像 grep 一样。在我的系统上,它是/usr/bin/[. (好吧,从技术上讲,您的 shell 可能内置了它,但这是一种优化。它的行为就像一个命令一样)。它的工作方式相同,[为真返回零退出代码,为假返回非零退出代码。(test与 相同[,除了结束])
ami*_*gal 70
另一种简单的方法是使用grep -c.
输出(不作为退出代码返回),与模式匹配的行数,因此如果不匹配则为 0,如果匹配则为 1 或更多。
因此,如果您想检查模式是否匹配 3 次或更多次,您可以这样做:
if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
...
Run Code Online (Sandbox Code Playgroud)
小智 11
我知道我迟到了,但我喜欢这个简短的版本:
grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
Run Code Online (Sandbox Code Playgroud)