shell 脚本中 for 循环异常终止的问题

2018-12-27 15:01:22 +08:00
 lolcat

for i in seq 1 3 do #当前目录下没有 lsjdljslf 文件 ls lsjdljslf done

3716 次点击
所在节点    Linux
8 条回复
lolcat
2018-12-27 15:22:36 +08:00
点错了,竟然把帖子发出去了。。。。
正在使用一台 ubuntu16.04 的服务器,bash 版本 4.3.48,不过我只能通过 Jenkins 在上面运行一些脚本。
在脚本的 for 循环中,一旦出现返回值非 0 的命令,这个脚本就会立即终止,如果出现在 for 循环之外就不会异常终止,我在我本地的 ubuntu16.04 的电脑上执行这个脚本是没有问题的,脚本例子如下:


for i in `seq 1 3`
do
#当前目录下没有 lsjdljslf 文件,所以下面这句话返回 1,执行到这脚本就异常退出
ls lsjdljslf
done



有人知道这是怎么回事吗?
privil
2018-12-27 16:02:15 +08:00
shell -e 参数 jenkins 运行脚本都会默认加这个参数,你要执行的脚本里面 set +e 就好了
xuboying
2018-12-27 16:25:51 +08:00
set +e 可以设置在代码的任何地方。不可靠代码执行结束以后可以再用 set -e 打开严格模式
ps1aniuge
2018-12-27 16:39:38 +08:00
shell 中的坑,幺蛾子,隐藏的问题太多。powershell for linux 没这种问题。
set +o noglob
touch /tmp/a1log
A="/tmp/a*log" ;echo $A
#返回 /tmp/a1log

B='/tmp/a*log' ;echo $B
#返回 /tmp/a1log
lolcat
2018-12-27 16:49:59 +08:00
@privil 非常感谢,我在本地测试了一下,在脚本的开头加
#!/bin/bash -e
确实出现了一旦脚本中出现返回值非 0 的命令,脚本立即退出的情况,但是我在 Jenkins 上运行的那个脚本的非 for 循环的地方加一个必错的命令,比如
ls lsjdlsjaf
脚本会继续执行下去,不会立即退出,只有在 for 循环里出现非 0 返回值的命令才会立即退出。你知道这是啥情况吗?
lolcat
2018-12-27 16:52:16 +08:00
@xuboying 非常感谢,我在本地测试了一下,在脚本的开头加
#!/bin/bash -e
确实出现了一旦脚本中出现返回值非 0 的命令,脚本立即退出的情况,但是我在 Jenkins 上运行的那个脚本的非 for 循环的地方加一个必错的命令,比如
ls lsjdlsjaf
脚本会继续执行下去,不会立即退出,只有在 for 循环里出现非 0 返回值的命令才会立即退出。你知道这是啥情况吗?
lolcat
2018-12-28 10:38:41 +08:00
@privil 我知道咋回事了,我没认真分析,那个脚本里 source 了另一个脚本,另一个脚本里有 set -e
lolcat
2018-12-28 10:38:59 +08:00
@xuboying 我知道咋回事了,我没认真分析,那个脚本里 source 了另一个脚本,另一个脚本里有 set -e

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/521529

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX