首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
V2EX  ›  Linux

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

  •  
  •   lolcat · 203 天前 · 1217 次点击
    这是一个创建于 203 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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


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



    有人知道这是怎么回事吗?
        2
    privil   203 天前   ♥ 1
    shell -e 参数 jenkins 运行脚本都会默认加这个参数,你要执行的脚本里面 set +e 就好了
        3
    xuboying   203 天前   ♥ 1
    set +e 可以设置在代码的任何地方。不可靠代码执行结束以后可以再用 set -e 打开严格模式
        4
    ps1aniuge   203 天前
    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
        5
    lolcat   203 天前
    @privil 非常感谢,我在本地测试了一下,在脚本的开头加
    #!/bin/bash -e
    确实出现了一旦脚本中出现返回值非 0 的命令,脚本立即退出的情况,但是我在 Jenkins 上运行的那个脚本的非 for 循环的地方加一个必错的命令,比如
    ls lsjdlsjaf
    脚本会继续执行下去,不会立即退出,只有在 for 循环里出现非 0 返回值的命令才会立即退出。你知道这是啥情况吗?
        6
    lolcat   203 天前
    @xuboying 非常感谢,我在本地测试了一下,在脚本的开头加
    #!/bin/bash -e
    确实出现了一旦脚本中出现返回值非 0 的命令,脚本立即退出的情况,但是我在 Jenkins 上运行的那个脚本的非 for 循环的地方加一个必错的命令,比如
    ls lsjdlsjaf
    脚本会继续执行下去,不会立即退出,只有在 for 循环里出现非 0 返回值的命令才会立即退出。你知道这是啥情况吗?
        7
    lolcat   202 天前
    @privil 我知道咋回事了,我没认真分析,那个脚本里 source 了另一个脚本,另一个脚本里有 set -e
        8
    lolcat   202 天前
    @xuboying 我知道咋回事了,我没认真分析,那个脚本里 source 了另一个脚本,另一个脚本里有 set -e
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2151 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 15:40 · PVG 23:40 · LAX 08:40 · JFK 11:40
    ♥ Do have faith in what you're doing.