我有简单的shell脚本,试图找出一个特定的docker容器正在运行。 在shell脚本中,我有下面一行;
RUNNING_CONTAINERS=$(docker ps -a | grep ${IMAGE_NAME})
如果grep没有返回结果,那么shell脚本就会退出。 我怎么写我的脚本,以确保脚本继续执行,即使grep的结果是空的?
如何在shell脚本中正确地进行string比较?
传递关联数组作为参数与Bash
用bash shell脚本提取2个string之间的string
原因是在代码中存在set -e ,这使得脚本在命令返回非零状态时立即退出。 在这种情况下, grep因为没有找到任何匹配。
正如Bash参考手册 – > The set builtin中所读的那样
-e
如果可能由单个简单命令(请参阅简单命令),列表(请参阅列表)或复合命令(请参阅复合命令)组成的管道(请参阅管道)返回非零状态,请立即退出。 如果失败的命令是命令列表的一部分,那么shell将不会立即退出,直到关键字,if语句中的测试的一部分,以及在&&或||中执行的任何命令的一部分。 除了最后的&&或||之后的命令,管道中的最后一个命令,或者命令的返回状态与! 如果复合命令以外的子shell返回非零状态,因为命令失败,而-e被忽略,shell不会退出。 如果设置了ERR,则会在shell退出之前执行陷阱。
另外,从man grep :
退出状态
正常情况下,如果选择一条线,退出状态为0,如果未选择线,则退出状态为1,如果发生错误,退出状态为2。 但是,如果使用了-q或–quiet或–silent并且选择了一行,即使发生错误,退出状态也为0。
所以grep没有找到任何东西,并返回一个非零的退出状态。 然后, set -e捕获它,并且看到它不是来自“异常”( if …正如参考文献中提到的那样),既不在管道中的最后一个命令之前,也退出。
测试
我们来创建一个非常基本的脚本:
$ cat a.sh #!/bin/bash set -e echo "hello" grep "hello" a echo "bye"
$ touch a
如果我们运行它,当grep不返回任何结果时,我们看到它退出:
$ ./a.sh hello
$ ./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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。