bash中的条件GOTO,从一个函数跳到后来调用的函数
考虑下面的伪代码bash中的条件GOTO,从一个函数跳到后来调用的函数,bash,function,shell,while-loop,Bash,Function,Shell,While Loop,考虑下面的伪代码 如果http\u code大于400,我想在读取循环时运行中的所有函数 否则,流应该直接跳到func\u ws8 这不能像写的那样工作(continue抱怨它除了在循环内之外无效,并且goto根本不存在);为了达到预期效果,我可以编写哪些等效代码 #!/bin/bash func_ws206 { if [ $http_code -gt 400 ] continue else goto func_ws8 fi } # stub function
- 如果
大于400,我想在读取http\u code
循环时运行
中的所有函数
- 否则,流应该直接跳到
func\u ws8
continue
抱怨它除了在循环内之外无效,并且goto
根本不存在);为了达到预期效果,我可以编写哪些等效代码
#!/bin/bash
func_ws206 {
if [ $http_code -gt 400 ]
continue
else
goto func_ws8
fi
}
# stub functions; in the real code, these actually do something.
func_ws250 { :; }
func_ws8 { :; }
func_ws302 { :; }
func_ws65 { :; }
while IFS= read -r msisdn
do
echo "$msisdn"
func_ws206
func_wc250
func_ws8
func_302
func_ws65
done < es_msisdn.txt
#/bin/bash
func_ws206{
如果[$http_代码-gt 400]
持续
其他的
转到func_ws8
fi
}
#存根函数;在真正的代码中,它们实际上做了一些事情。
func_ws250{:;}
func_ws8{:;}
func_ws302{:;}
func_ws65{:;}
而IFS=读取-r msisdn
做
回显“$msisdn”
func_ws206
func_wc250
func_ws8
func_302
func_ws65
完成
考虑如下情况,我们使用一个全局goto
变量和一个在每次函数调用之前检查其值的包装器:
#!/usr/bin/env bash
# ^^^^- NOT sh, so we can use bash-local syntax
func_ws206() {
if (( http_code <= 400 )); then
goto=ws8
fi
}
func_ws250() { echo "In ws250" >&2; }
func_ws8() { echo "In ws8" >&2; }
func_ws302() { echo "In ws302" >&2; }
func_ws65() { echo "In ws65" >&2; }
run_funcs() {
goto=
for funcname do # default for loop behavior iterates over "$@"
if [[ $goto ]]; then
if [[ $goto != "$funcname" ]]; then
continue
else
goto=
fi
fi
"func_${funcname}"
done
}
while IFS= read -r msidn; do
run_funcs ws206 wc250 ws8 302 ws65
done
#/usr/bin/env bash
#不是sh,所以我们可以使用bash本地语法
func_ws206(){
if((http_代码&2;}
func_ws8(){echo“在ws8”>&2;}
func_ws302(){echo“在ws302”>&2;}
func_ws65(){echo“在ws65”>&2;}
运行_funcs(){
后藤=
对于funcname do#默认循环行为在“$@”上迭代
如果[[$goto]];则
如果[[$goto!=“$funcname”]];则
持续
其他的
后藤=
fi
fi
“func${funcname}”
完成
}
而IFS=read-r msidn;do
运行函数ws206 wc250 ws8 302 ws65
完成
使用退出状态进行流控制。func_ws206
的调用者应该决定接下来执行什么,而不是func_ws206
本身
#!/bin/bash
func_ws206 () {
[ $http_code -gt 400 ]
}
# stub functions; in the real code, these actually do something.
func_ws250 () { :; }
func_ws8 () { :; }
func_ws302 () { :; }
func_ws65 () { :; }
while IFS= read -r msisdn
do
echo "$msisdn"
if func_ws206; then
func_wc250
fi
func_ws8
func_302
func_ws65
done < es_msisdn.txt
!/bin/bash
func_ws206(){
[$http_代码-gt 400]
}
#存根函数;在实际代码中,它们实际上做了一些事情。
func_ws250(){:;}
func_ws8(){:;}
func_ws302(){:;}
func_ws65(){:;}
而IFS=读取-r msisdn
做
回显“$msisdn”
如果func_ws206;那么
func_wc250
fi
func_ws8
func_302
func_ws65
完成
我试图将其改写得更加集中和清晰。希望它能够成功地表示您想问的问题?顺便说一句,请注意,$http\u code
应该被引用为“$http\u code”
,这样您就不会传递[
无效语法,如果它是空的,或者如果它被拆分为多个参数。或者您可以使用[[
或((
,这没有问题。我当然不会使用@GillesQuenot,但这是OP的逻辑。他们使用-gt 400
(而不是-ge 400
),所以他们显然希望400和200或399在同一个班上。这对他们来说是否是正确的选择是他们的问题。一般来说,这肯定是更好的做法,但有时有一个合理的“转到”要求/跳到x;例如,我将其用于恢复点,以使脚本在中断后在正确的位置重新启动。