1. goto函数
# 1. go|check, 2. 跳转的FUNCNAME[go时]|check时入参为goto执行时所在的FUNCNAME
function goto() {
case ${1} in
go)
FUNC_GOTO=${2}
;;
check)
[ -z ${FUNC_GOTO} ] && return
if [ "x${2}" != "x${FUNC_GOTO}" ]; then
return 232
else
unset FUNC_GOTO
fi
;;
*)
;;
esac
}
2. 跳转
goto go FUNC_NAME_TO_GO
注意,这里的goto,是通过function中内建的FUNCNAME变量来实现校验的,因此,跳转到的部分,需要封装成function。
# cat skelchina.sh
#!/bin/bash
function skelChina () {
echo "Function Name: ${FUNCNAME}"
}
skelChina
# sh skelchina.sh
Function Name: skelChina
3. 校验
goto check ${FUNCNAME} || return 232 # check返回不为0时, 直接return
4. 示例
# cat skelchina.sh
#!/bin/bash
function goto() {
case ${1} in
go)
FUNC_GOTO=${2}
;;
check)
[ -z ${FUNC_GOTO} ] && return
if [ "x${2}" != "x${FUNC_GOTO}" ]; then
return 232
else
unset FUNC_GOTO
fi
;;
*)
;;
esac
}
function liemer () {
goto check ${FUNCNAME} || return 232
echo Liemer
}
function lius () {
goto check ${FUNCNAME} || return 232
echo Lius
}
goto go lius
# 调用两个
liemer
lius
# sh skelchina.sh # liemer函数校验没过, 不执行
Lius