21

我正在编写一个非常简单的 shell 脚本,它将查看所​​有失败测试的日志,并打印出当前目录中日志中所有文件的所有名称

 1  #! /bin/sh

 2  for file in *
 3  do
 4      echo "checking: $file"
 5      if [$(grep $file failed.txt -c) -ne 0]
 6      then
 7          echo "$file FAILED"
 8      fi
 9  done

当我执行它时,我得到这个错误:

line 6: [0: command not found

有谁知道为什么?

谢谢!!

4

3 回答 3

27

[实际上是 linux 中的命令(如 bash 或 cat 或 grep)。

$(grep $file failed.txt -c)是一个命令替换,在您的情况下评估为 0。因此,该行现在读取[0 -ne 0],这被解释为运行一个[0使用 arguments调用的程序-ne 0]

你应该写的是[ $(grep $file failed.txt -c) -ne 0 ]. Shell 脚本要求在左方括号和右方括号之间有空格。否则,您更改执行的命令(关闭]表示没有更多参数要读取。

所以现在命令评估为[ 0 -ne 0 ]. 您可以尝试在您的 shell 中执行此操作,看看会发生什么。如果表达式为真且为假[,则以 的值退出。您可以通过回显(要运行的最后一个命令的退出值)来查看退出值。01$?

于 2012-05-14T15:33:25.237 回答
7

您可以测试以下的返回码,而不是测试计数grep

if grep -q $file failed.txt &>/dev/null
于 2012-05-14T15:37:38.767 回答
1

脚本可以

#!/bin/sh

for file in *; do
    echo "checking: $file"
    grep failed.txt $file && echo "$file FAILED"
done

或者,作为用户 shell 命令历史记录中的单行:

for file in *; do { echo "checking: $file" && grep failed.txt $file && echo "$file FAILED"; done

man grep

EXIT STATUS
如果找到选定的行,则退出状态为 0,如果未找到,则退出状态为 1。如果发生错误,则退出状态为 2。(注意:POSIX 错误处理代码应检查“2”或更大。)

于 2012-05-14T17:51:37.800 回答