Shell命令 - 基于命令输出的条件?

时间:2010-06-29 06:57:46

标签: shell conditional-statements

如果文本文件中没有字符串,我正在尝试运行一些shell命令。如果我将此行粘贴到命令行中,如果给我一个错误。

if [ $(cat textfile.txt | grep "search string") -eq "" ]; then; echo "some string"; fi;

错误:

-bash: [: -eq: unary operator expected

4 个答案:

答案 0 :(得分:6)

如果您使用[]进行比较,则需要使用=代替-eq。你还需要一些报价。

if [ "$(cat textfile.txt | grep 'search string')" = "" ]; then; echo "some string"; fi;

请注意,grep可以使用文件名作为参数,因此cat是不必要的。您也可以直接使用grep的返回值:如果找不到搜索字符串,grep将返回1.

if [ "$(grep 'search string' textfile.txt)" ]; then
  echo "some string";
fi

更紧凑的方法是使用逻辑和&&

grep "search string" textfile.txt && echo "some string"

答案 1 :(得分:2)

grep -F -q -e 'search string' textfile.txt || echo 'Not found'

注意:

  • -F阻止将搜索字符串解释为正则表达式。
  • -q抑制所有输出并在找到第一个实例后立即返回,如果字符串出现在大文件的开头,则搜索速度会快得多。
  • -e明确指定模式,允许以破折号开头的模式。
  • 除非您想要变量替换,否则请使用单引号。

答案 2 :(得分:1)

如果找到请求的行,grep命令将返回0(如果没有,则返回1,如果错误,则返回2),因此您可以使用:

grep "search string" textfile.txt >/dev/null 2>&1
if [[ $? -ne 0 ]] ; then
    echo 'Not found'
fi

如果确实想要使用字符串(你可能不应该),你应该引用它们,这样你就不会得到[命令的太多参数:< / p>

if [ "$(cat textfile.txt | grep 'search string')" == "" ] ; then
    echo "It's not there!"
fi

答案 3 :(得分:1)

在这种情况下不需要方括号。由于[实际上是一个命令,因此可以在任何使用它的地方使用任何命令。所以在这里,我们可以使用grep。由于cat将接受文件名作为参数,因此无需使用grep。另外,你有两个太多的分号。

if grep -q "search string" textfile.txt; then echo "some string"; fi

if grep "search string" textfile.txt > /dev/null 2>&1; then echo "some string"; fi