我有一个简单的shell脚本,试图找出特定的docker容器是否正在运行。在shell脚本中,我有以下行;
SELECT * FROM
(
SELECT posts.titulo as value,
posts.id as id
FROM posts,familias,textos
AND lower(titulo) LIKE 'my title'
AND posts.id_familia = familias.id $familiaQuery
AND familias.clave = textos.clave
AND textos.lengua = 1
)
LEFT JOIN tags_map ON tags_map.id_receta = posts.id
LEFT JOIN tags ON tags_map.id_ing = tags.id
WHERE
tags.nombre LIKE 'php'
GROUP by posts.id
ORDER by count(*) desc
如果grep没有返回结果,那么shell脚本就会退出。即使grep的结果为空,我如何编写脚本以确保脚本继续执行?
答案 0 :(得分:4)
这样做的原因是代码中某处存在set -e
,这使得一旦命令返回非零状态,脚本就会退出。在这种情况下,grep
因为找不到匹配项。
阅读The Bash reference manual -> The set
builtin
-e
如果是管道(请参阅管道),可以立即退出,该管道可能包含a 单个简单命令(参见简单命令),列表(参见列表)或a 复合命令(请参阅复合命令)返回非零状态。 如果失败的命令是shell的一部分,则shell不会退出 命令列表紧跟一段时间或直到关键字,部分 if语句中的测试,是&&amp ;;中执行的任何命令的一部分。要么 ||列表除了最后一个&&之后的命令或||,任何命令 在管道中但是最后一个,或者命令的返回状态是什么 倒了!如果子shell以外的复合命令返回a 非零状态,因为在忽略-e时命令失败, shell不会退出。 ERR上的陷阱(如果已设置)在执行之前执行 shell退出。
此外,来自man grep
:
退出状态
如果选择了一行,通常退出状态为0,如果没有行则退出1 被选中,如果发生错误则为2。但是,如果-q或 使用--quiet或--silent并选择一行,即使发生错误,退出状态也为0.
因此grep
找不到任何内容并返回非零退出状态。然后,set -e
捕获它并看到它不是来自"异常" (if
,while
...如引用中所述),既不是在管道中的最后一个命令之前,也是它退出。
让我们创建一个非常基本的脚本:
$ cat a.sh
#!/bin/bash
set -e
echo "hello"
grep "hello" a
echo "bye"
并生成一个空的a
文件:
$ touch a
如果我们运行它,我们会在grep
没有返回任何结果时看到它退出:
$ ./a.sh
hello
但是,如果我们删除set -e
行,它会一直到文件的末尾:
$ ./a.sh
hello
bye
另请注意,如果grep
不是管道中的最后一个元素,它不会失败:
$ cat a.sh
#!/bin/bash
set -e
echo "hello"
grep "hello" a | echo "he"
echo "bye"
$ ./a.sh
hello
he
bye