shell实现类似goto的功能 – 跳转到后面的某段代码中

Shell Liemer_Lius 2273℃

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

 

转载请注明:liutianfeng.com » shell实现类似goto的功能 – 跳转到后面的某段代码中

喜欢 (4)

评论已关闭。