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

考虑下面的伪代码

  • 如果
    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 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;例如,我将其用于恢复点,以使脚本在中断后在正确的位置重新启动。