我有以下创建shell脚本的样板文件。parse_debug_options()
检测非逻辑选项,如-h
、--help
、--trace
或--verbose
。
它将脚本主逻辑的其余选项和参数附加到全局变量_logic_args
。main()
首先调用parse_debug_options()
,然后执行set -- "${_logic_args[@]}"
以修改$@
。
我希望消除全局变量,尤其是可变变量。
但是,在parse_debug_options()
中使用set --
不会修改全局$@
,我需要添加在parse_debug_options()
和main()
之间共享的全局_logic_args
。
是否可以从函数内部删除_logic_args
并修改脚本范围的$@
?
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
declare -a _logic_args=()
function usage() {
cat <<EOF >&2
DESCRIPTION
Usage:
${0##*/} [options] [arguments]
Options:
Arguments:
Debug Options:
-h, --help Show this help message and exit
--trace Enable tracing (set -o xtrace)
EOF
}
function parse_debug_options() {
for arg in "$@"; do
case "$arg" in
-h | --help)
usage
exit 0
;;
--trace)
echo "Tracing enabled for ${0##*/}" >&2
set -o xtrace
;;
*)
_logic_args+=("$arg")
;;
esac
done
}
function main() {
parse_debug_options "$@"
set -- "${_logic_args[@]}"
true
}
main "$@"
2条答案
按热度按时间ej83mcc01#
不能在函数中使用全局
$@
。或者,我使用下面的代码(适合您)。
但之后,我不再使用全局
"$@"
,而是使用global_params
变量。cigdeys32#
真的没有办法做到这一点;
$@
对于每个函数自动是本地的。如果您想强制执行,请让函数将结果发送到标准输出,并执行如下操作
在全球范围内。