Linux 变量赋值退出shell脚本
我有一个简单的shell脚本,它试图找出特定的docker容器是否正在运行。在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,因为它没有找到任何匹配项 如所读 如果管道(请参阅管道)可能
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