Linux 变量赋值退出shell脚本

Linux 变量赋值退出shell脚本,linux,bash,shell,Linux,Bash,Shell,我有一个简单的shell脚本,它试图找出特定的docker容器是否正在运行。在shell脚本中,我有以下行: RUNNING_CONTAINERS=$(docker ps -a | grep ${IMAGE_NAME}) 如果grep没有返回任何结果,那么shell脚本就在那里退出。如何编写脚本以确保即使grep的结果为空,脚本仍能继续执行?原因是代码中的某个地方存在set-e,一旦命令返回非零状态,脚本就会退出。在本例中,grep,因为它没有找到任何匹配项 如所读 如果管道(请参阅管道)可能

我有一个简单的shell脚本,它试图找出特定的docker容器是否正在运行。在shell脚本中,我有以下行:

RUNNING_CONTAINERS=$(docker ps -a | grep ${IMAGE_NAME})

如果grep没有返回任何结果,那么shell脚本就在那里退出。如何编写脚本以确保即使grep的结果为空,脚本仍能继续执行?

原因是代码中的某个地方存在
set-e
,一旦命令返回非零状态,脚本就会退出。在本例中,
grep
,因为它没有找到任何匹配项

如所读

如果管道(请参阅管道)可能包含 单个简单命令(请参见简单命令)、列表(请参见列表)或 复合命令(请参见复合命令)返回非零状态。 如果失败的命令是 紧跟while或until关键字之后的命令列表 if语句中的测试,是在&&or语句中执行的任何命令的一部分 ||列出除最后一个&&或| |之后的命令以外的任何命令 在管道中,但在最后一个管道中,或者如果命令的返回状态为 倒转!。如果子shell以外的复合命令返回 非零状态,因为在忽略-e时命令失败, 外壳不会退出。错误陷阱(如果设置)在 壳牌退出

另外,从
man grep

退出状态

通常,如果选择了一行,则退出状态为0,如果没有行,则退出状态为1 已选择,如果发生错误,则为2。但是,如果-q或 --如果使用静默或--silent,并且选中一行,则即使发生错误,退出状态也为0

因此,
grep
没有找到任何内容,并返回非零退出状态。然后,
set-e
捕获它并发现它不是来自“异常”(
if
while
…如参考中所述),也不是在管道中最后一个命令之前,因此它退出

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

$ cat a.sh 
#!/bin/bash

set -e
echo "hello"
grep "hello" a
echo "bye"
并生成一个空的
文件:

$ 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

这可能是因为脚本中的某个地方,
grep
没有返回任何结果,退出状态为非零。是的,我有。回答并解释为什么这很重要,我很乐意接受。
$ cat a.sh
#!/bin/bash

set -e
echo "hello"
grep "hello" a | echo "he"
echo "bye"
$ ./a.sh 
hello
he
bye