检查shell脚本中命令的输出

One*_*ree 21 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
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我收到此错误:

line 6: [0: command not found
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?

谢谢!!

Dun*_*nes 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如果是假的.您可以通过echoing $?(要运行的最后一个命令的退出值)查看退出值.


l0b*_*0b0 7

您可以测试返回代码,而不是测试计数grep:

if grep -q $file failed.txt &>/dev/null
Run Code Online (Sandbox Code Playgroud)

  • 使用`grep -q`可以获得一些效率 - 如果匹配,grep会立即退出. (3认同)
  • 问题也被标记为"shell",许多阅读这些问题的人对可移植性问题知之甚少.在使用它们时,提及特定于shell的情况非常重要.使用shell特定功能没有任何问题,但这种使用应该通过感知来完成. (2认同)