我有一个场景,我每次将它传递给函数时都要检查非零大小的输入参数。我无法在函数本身中添加检查。我正在研究这样的事情https://unix.stackexchange.com/questions/125819/bash-function-decorator
我要在很多地方使用该功能,所以每次调用该函数时我都不想使用if条件。是否在链接中使用了一个docorator,这是一个很好的方法吗?
答案 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==