Bash 4.4+如果" break"则返回错误在函数

时间:2018-06-01 17:50:51

标签: bash

对于Bash< 4.4这很好用

function() {
    if [something happens]; then break ; fi
}

while [ ... ]
do
   function
done

基本上,bash< 4.4当"事情发生时退出此循环",而bash 4.4+返回错误" break:仅在for',中有意义而在'或``直到'环路"并且不会退出while循环。

如何修复此问题以适用于所有bash版本?

2 个答案:

答案 0 :(得分:2)

该函数是从while循环调用的,但是break语句不能从它所在的位置看到while循环。您有两种选择:

  1. 不要让while循环调用该函数,而是将函数设置为内联函数,并将所有逻辑包含在while循环中。

  2. 更改函数以使返回值为0/1,并使用if语句确定循环是否应退出,即:

  3. doFirst(array){
       this.setState(previousState => ({ test: {...previousState.test, array} }));
    }
    
    doSecond(idx) {
        this.setState(previousState => ({ test: {...previousState.test, idx} }));
    }
    

答案 1 :(得分:-2)

您也可以使用eval,就像您采购单一功能一样:

#!/usr/bin/env bash

i=0

a() {
    echo 'if [ "$i" -eq 3 ] ; then break ; fi'
}

while [ ... ]
do
   i=$((i+1))
   eval "$(a)"
done

printf -- "exited\n"

我在bash 4.4.23git构建的bash 4.3.46上对此进行了测试。

修改

正如下面评论中正确指出的那样,这种方法很脆弱,应谨慎使用。总而言之,我更喜欢jeremysprofile's回答。