检查shell脚本中命令的输出

时间:2012-05-14 15:23:33

标签: bash shell

我正在编写一个非常简单的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

有谁知道为什么?

谢谢!

3 个答案:

答案 0 :(得分:27)

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

$(grep $file failed.txt -c)是一个命令替换,在你的情况下计算为0.因此该行现在读取[0 -ne 0],它被解释为运行一个名为[0的程序,其参数为-ne 0] }。

你应该写的是[ $(grep $file failed.txt -c) -ne 0 ]。 Shell脚本要求开始和结束方括号之间有空格。否则,您更改执行的命令(结束]表示不再有要读取的参数。

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

答案 1 :(得分:7)

您可以测试grep的返回代码:

,而不是测试计数
if grep -q $file failed.txt &>/dev/null

答案 2 :(得分: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

中的

  

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