我想检查一个文件是否包含一个特定的字符串或不在bash。我使用了这个脚本,但它不起作用:

 if [[ 'grep 'SomeString' $File' ]];then
   # Some Actions
 fi

我的代码出了什么问题?


当前回答

最短(正确)版本:

grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"

也可以写成

grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"

但在这种情况下,你不需要显式地测试它,所以对:

grep -q "something" file && echo "yes" || echo "no"

其他回答

最短(正确)版本:

grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"

也可以写成

grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"

但在这种情况下,你不需要显式地测试它,所以对:

grep -q "something" file && echo "yes" || echo "no"
grep -q [PATTERN] [FILE] && echo $?

如果找到模式,则退出状态为0 (true);否则blankstring。

我这样做了,似乎还不错

if grep $SearchTerm $FileToSearch; then
   echo "$SearchTerm found OK"
else
   echo "$SearchTerm not found"
fi

除了告诉你如何做你想做的事情的其他答案之外,我试图解释哪里出了问题(这是你想要的)。

在Bash中,if后面跟着一个命令。如果该命令的退出码为0,则执行then部分,否则执行else部分。

你可以用其他答案中解释的任何命令来做到这一点:然后…;fi

[[是一个内部bash命令,专门用于一些测试,如文件存在性、变量比较。类似地,[是一个外部命令(它通常位于/usr/bin/[),执行大致相同的测试,但需要]作为最终参数,这就是为什么]必须在左侧填充一个空格,而[]则不是这样。

这里你不需要[[nor[]。

另一件事是你引用东西的方式。在bash中,只有一种情况下双引号嵌套,它是"$(命令"参数")"。但是在'grep 'SomeString' $File'中只有一个单词,因为'grep '是一个引用的单位,它与SomeString连接,然后再次与' $File'连接。由于使用了单引号,变量$File甚至没有被它的值替换。正确的方法是grep 'SomeString' "$File"。

试试这个:

if [[ $(grep "SomeString" $File) ]] ; then
   echo "Found"
else
   echo "Not Found"
fi