我正在编写一个非常简单的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
有谁知道为什么?
谢谢!
答案 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”或更高。)