变量赋值退出shell脚本

时间:2015-11-13 13:23:24

标签: linux bash shell

我有一个简单的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的结果为空,我如何编写脚本以确保脚本继续执行?

1 个答案:

答案 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捕获它并看到它不是来自"异常" (ifwhile ...如引用中所述),既不是在管道中的最后一个命令之前,也是它退出。

测试

让我们创建一个非常基本的脚本:

$ 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