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

3
我正在尝试运行一些shell命令,如果一个字符串不存在于文本文件中。如果我将这行代码粘贴到命令行中,它会给我一个错误。
if [ $(cat textfile.txt | grep "search string") -eq "" ]; then; echo "some string"; fi;

错误:

-bash: [: -eq: unary operator expected
4个回答

7
如果您使用[]进行比较,则需要使用=而不是-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"

你不必更改引号,这是有效的bash命令:“$(cat textfile.txt | grep "search string")”。 - Tyilo

2
< p > 如果找到所请求的行,grep命令将返回0(未找到则返回1,出现错误则返回2),因此您只需使用以下命令: < /p>
grep "search string" textfile.txt >/dev/null 2>&1
if [[ $? -ne 0 ]] ; then
    echo 'Not found'
fi

如果你真的想使用字符串(但你可能不应该这样做),那么你应该引用它们,这样你就不会为[命令获得太多参数:

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

我没有给你的回答点踩,但是它远非最佳方案:因为grep有一个-q选项,所以不需要进行重定向,并且Bash可以通过检测命令的返回值而不必使用$? - Philipp
没问题,Philipp。并不是所有的grep都有这些选项(我仍然在使用一些旧版UNIX),而且我也不会为了效率而编写shell脚本。我将在未来的(现代)脚本中加入你的答案,所以给你点赞。 - paxdiablo

2
在这种情况下不需要使用方括号。由于 [ 实际上是一个命令,任何命令都可以在你需要它的地方使用。所以在这里,我们可以使用 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

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

注意:
  • -F 选项可以防止将搜索字符串解释为正则表达式。
  • -q 选项可以抑制所有输出,并在找到第一个匹配项后立即返回,如果字符串出现在大文件的开头,则可以使搜索速度更快。
  • -e 选项可以显式指定模式,允许以破折号开头的模式。
  • 使用单引号,除非您想要变量替换。

优雅。不知怎么的,有人试图将 Bash 变成 Perl [[$( 不幸地。 - msw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接