Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 检查shell脚本中命令的输出_Bash_Shell - Fatal编程技术网

Bash 检查shell脚本中命令的输出

Bash 检查shell脚本中命令的输出,bash,shell,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 当我执行它时,会出现以

我正在编写一个非常简单的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
有人知道为什么吗


谢谢

[
实际上是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中执行该命令,以查看发生了什么情况。
[/code>如果表达式为true,则以
0
的值退出,如果表达式为false,则以
1
的值退出。您可以通过回显
$?
来查看退出值(要运行的最后一个命令的退出值).

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

if grep -q $file failed.txt &>/dev/null
脚本可以是

#!/bin/sh

for file in *; do
    echo "checking: $file"
    grep failed.txt $file && echo "$file FAILED"
done
或者,作为用户shell命令历史记录中的一行程序:

对于*中的文件;执行{echo“检查:$file”&&grep failed.txt$file&&echo“$file failed”;完成

man grep中

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


您想将-ne移动到if语句的开头缺少空格:
if[$(grep$file failed.txt-c)-ne 0]
好吧,您也可以始终将整个脚本放在一行中。
cat failed.txt | xargs ls-f1 2>/dev/null
您可以使用
grep-q
获得一些效率——如果存在匹配项,grep会立即退出。请注意,&>重定向不是posix。Bash将其解释为“>/dev/null 2>&1”,但并非所有shell都会这样。(例如,dash将在后台调用grep并截断/dev/null)@williampersell:对于其他shell很有用,但问题是关于Bash的。这个问题也被标记为“shell”,许多阅读这些问题的人对可移植性问题知之甚少。在使用shell时,提及特定于shell的情况很重要。使用特定于shell的功能没有错,但是这种用法应该意识到这一点。你仍然应该避免使用反勾号(Backticks)(请特别查看单独的示例)@tripleee是一个很好的建议,但我不会说在这种情况下特别相关,因为与ARG_LIMIT相比,这种情况下grep的输出可能很小。尽管正如有人在另一篇评论中指出的那样,
if grep$file failed.txt-q
是理想的解决方案。我一般不喜欢使用输出重定向,因为它们会使脚本变得很难er阅读(更多令牌供我阅读和处理)。哦,当然;
如果grep-q
也是我的意思。(你似乎把搜索模式和文件参数颠倒了?)@tripleee一开始我以为是关于参数的,但是检查OP。他正在搜索failed.txt中是否存在文件名。对不起,我是在与@Rony的答案进行比较,但他的参数顺序是错误的。