代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

为什么减少shell变量作为未使用参数的副作用?

  •  1
  • paxdiablo  · 技术社区  · 7 年前

    最近在尝试调试某些网络代码时,我遇到了一个重试循环,以下面的一个缩减形式显示:

    while [ ${DELAY} -gt 0 ] ; do
        doSomething
        sleep 1
        : $((DELAY -= 1))
    done
    

    现在我明白了 什么 正在做,我只是不确定 为什么? 就是这样做的。这个 bash-builtins man 页面状态:

    : [arguments] 没有效果;该命令除了扩展参数和执行任何指定的重定向之外,什么也不做。

    因为您可以简单地修改 bash 只是 ((DELAY -= 1)) 为什么要这样做 副作用 把结果给 : 命令,它计算但不使用它?

    2 回复  |  直到 7 年前
        1
  •  1
  •   paxdiablo    7 年前

    这实际上与自动错误处理有关。因为调用此代码的脚本正在运行 set -e ,出错时将立即退出。

    您可以使用以下脚本查看效果:

    set -e
    DELAY=10
    while [ ${DELAY} -gt 0 ] ; do
        echo Delaying $DELAY
        ((DELAY -= 1))
    done
    echo Finishing
    

    有了这个剧本,你永远不会 看见 这个 Finishing 因为“退出代码 ((DELAY -= 1)) 0 通常,但是 1 当该值降至零时。这意味着 集合E 在操作中,将在该点停止脚本。

    使用 : $((DELAY -= 1)) 总是 具有零退出代码,因此不会过早退出。

    这种退出代码行为最适合于:

    DELAY=10
    while [ ${DELAY} -gt 0 ] ; do
        echo Delaying $DELAY
    
        # Select one of these below, comment the other:
        ((DELAY -= 1))
        #: $((DELAY -= 1))
    
        echo "   Exit code $?"
    done
    echo Finishing
    

    改变哪条线用于减量 DELAY .

        2
  •  0
  •   phs    7 年前

    如果 set -x 正在运行,序列 : 3 , : 2 , : 1 将得到回应。

    这是一种“廉价”的方法,既可以减少,也可以选择性地回显结果。

    推荐文章