作为此脚本的一部分,我需要能够检查给定的第一个参数是否与文件的第一个单词匹配。如果是,则退出并显示错误消息;如果没有,请将参数附加到文件中。我了解如何编写该if
语句,但不知道如何grep
在脚本中使用。我知道看起来grep
像这样
grep ^$1 schemas.txt
我觉得这应该比我做的容易得多。
我在声明中收到错误“参数太多” if
。我去掉了之间的空格grep -q
,然后得到了预期的错误二元运算符。
if [ grep -q ^$1 schemas.txt ]
then
echo "Schema already exists. Please try again"
exit 1
else
echo "$@" >> schemas.txt
fi
答案1
grep
如果找到某些内容(零)与未找到任何内容(非零),则返回不同的退出代码。在if
语句中,零退出代码映射为“true”,非零退出代码映射为 false。另外,grep有一个-q
参数,不输出匹配的文本(而只返回退出状态码)
因此,您可以像这样使用 grep:
if grep -q PATTERN file.txt; then
echo found
else
echo not found
fi
快速说明一下,当您执行类似的操作时if [ -z "$var" ]…
,事实证明这[
实际上是您正在运行的命令,就像 grep 一样。在我的系统上,它是/usr/bin/[
. (嗯,从技术上讲,您的 shell 可能内置了它,但这是一种优化。它的行为就好像它是一个命令)。它的工作方式相同,[
对于 true 返回零退出代码,对于 false 返回非零退出代码。 (test
与 相同[
,除了结束语之外]
)
答案2
另一种简单的方法是使用grep -c
.
该输出(不作为退出代码返回)是与模式匹配的行数,因此如果没有匹配则为 0,如果有匹配则为 1 或更多。
因此,如果您想检查模式是否匹配 3 次或更多次,您可以这样做:
if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
...
答案3
我知道我迟到了,但我喜欢这个简短的版本:
grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
答案4
老帖子,但实际上从未给出答案。
是 如果找到模式,Grep 返回 0 (true);如果未找到模式,则 Grep 返回 1 (false)。请记住 grep 是基于行的,因此您认为可以完成所有操作的搜索词可能会给您带来很多垃圾点击,我将其留给您来弄清楚如何解析。 $?是退出状态,我更喜欢使用管道而不是从文件中读取,因为它更适合我的脚本。我使用以下内容:
{猫/剪切/回声/卷曲/无论什么} | grep -q 模式 |echo $?
如果上面返回 0,则说明已找到模式,如果返回 1,则未找到。
这很有用,因为我将它放在 while 循环中来监视我的进程,并在某些脚本死掉时保持它们处于活动状态,或者在它们完成时通知我。