在bash / korn脚本中装饰函数是一种很好的编程习惯吗?

时间:2014-09-15 18:34:34

标签: bash shell ksh

我有一个场景,我每次将它传递给函数时都要检查非零大小的输入参数。我无法在函数本身中添加检查。我正在研究这样的事情https://unix.stackexchange.com/questions/125819/bash-function-decorator

我要在很多地方使用该功能,所以每次调用该函数时我都不想使用if条件。是否在链接中使用了一个docorator,这是一个很好的方法吗?

2 个答案:

答案 0 :(得分:2)

我对使用

的代码感觉好多了
[[ -n $value ]] && somefunc "$value"

somefunc "${value:-defaultvalue}"

相信我(或其他人)在尝试编写重新定义eval的函数装饰器时获得了somefunc魔法权,以便

somefunc "$value"

自动做同样的事情。

我可能会将该函数复制到我自己的脚本中并添加参数check,或者定义一个简单的包装器:

somefunc_with_type_check () {
    if [[ -z $1 ]]; then
        # take necessary action
    fi
    somefunc "$@"
}

答案 1 :(得分:1)

对于调试目的,您可以在致电somefunc时使用一些检查功能,例如

somefunc "$a" #your current calling
#change it to
somefunc "$(cz a)"   #call the cz function for Checking Zero on variable "a"

您的检查功能可能会调用堆栈转储等内容,例如下一个例子

dumpstack() {
    echo "ARG ERROR: $@" >&2
    local i=0
    for(( i=${#BASH_LINENO[@]}-2; i>=0; i-- ))
    do
        printf "\tFile:%s line:%s func:%s\n"  "${BASH_SOURCE[i+1]}" "${BASH_LINENO[i]}"  "${FUNCNAME[i+1]}" >&2
    done
}

cz() {
    [[ -n "${!1}" ]] || dumpstack "zero arg $1"   #indirect variable checking
    echo "${!1}"
}

somefunc() {
    echo "got this ==$1=="
}

a=
somefunc "$(cz a)"  #warns on zero length

a=5
somefunc "$(cz q)"  #warns on mistyped variable

somefunc "$(cz a)"  #ok

打印

ARG ERROR: zero arg a
    File:y line:20 func:main
    File:y line:11 func:cz
got this ====
ARG ERROR: zero arg q                #<-- shows the used variable name
    File:y line:23 func:main
    File:y line:11 func:cz
got this ====
got this ==5==