对于Bash< 4.4这很好用
function() {
if [something happens]; then break ; fi
}
while [ ... ]
do
function
done
基本上,bash< 4.4当"事情发生时退出此循环",而bash 4.4+返回错误" break:仅在for',
中有意义而在'或``直到'环路"并且不会退出while循环。
如何修复此问题以适用于所有bash版本?
答案 0 :(得分:2)
该函数是从while循环调用的,但是break语句不能从它所在的位置看到while循环。您有两种选择:
不要让while循环调用该函数,而是将函数设置为内联函数,并将所有逻辑包含在while循环中。
更改函数以使返回值为0/1,并使用if语句确定循环是否应退出,即:
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.23
和git
构建的bash 4.3.46
上对此进行了测试。
修改:
正如下面评论中正确指出的那样,这种方法很脆弱,应谨慎使用。总而言之,我更喜欢jeremysprofile's回答。