【问题标题】:Too Many Arguments If Statement BashIf Statement Bash 参数太多
【发布时间】:2013-04-18 07:27:01
【问题描述】:

我正在尝试使用带有 grep 的 if 语句来检查某些文件中是否存在字符串。现在,grep 语句自己工作,但是当我将它作为if 语句的一部分运行时,输出是:

line 6: [: too many arguments

我的代码:

#!/bin/bash

if [ $(grep -c "OutOfMemory" /my/path/to/domains/*/*/subdomains/*/logs/*.*) -ne 0 ];    
then
     echo "String found" 

else
     echo "String not found"

fi 

如果尝试使用较短的路径但没有帮助。

任何建议都会有所帮助。

谢谢,

【问题讨论】:

  • 使用find搜索文件,然后find的exec会帮你grep。然后将结果存储在某个变量中并使用它。没有给出答案。有很多可用的例子

标签: bash if-statement grep arguments


【解决方案1】:

问题是您的grep -c 没有产生正确的输出。

例如,您可以获得多个文件:

$ grep -c "OutOfMemory" /my/path/to/domains/*/*/subdomains/*/logs/*.*
/my/path/to/domains/a/b/subdomains/c/logs/my.log:1
/my/path/to/domains/a/b/subdomains/c/logs/another.log:2

您的if 语句无法处理grep 返回的多行,因此它以too many arguments 失败。

如果您想查看是否有任何文件包含字符串“OutOfMemory”,请改为:

if grep -q "OutOfMemory" /my/path/to/domains/*/*/subdomains/*/logs/*.*
then
...

【讨论】:

  • 如果我理解正确,这将在违反第一个条件时退出?顺便说一句,谢谢您的快速回答。
  • 不确定你的意思。如果在其中任何一个文件中找到该字符串,它将 grep 您的所有文件,然后返回退出代码 0(真),如果未找到,则返回 1(假)。 if 语句将使用此退出代码。
  • 如果您的grep 支持该标志,您可以添加-m 1 以确保grep 在第一次匹配后返回。
  • -m 1 标志适用于每个输入文件,而不是所有输入文件,这意味着即使在第一个文件中找到匹配项,grep 仍将在每个文件上运行。我想无论如何都值得添加,因为 grep 会在每个文件上更快地返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2016-04-16
相关资源
最近更新 更多