shell 如何从函数内部修改全局$@?

wvmv3b1j  于 2022-12-30  发布在  Shell
关注(0)|答案(2)|浏览(339)

我有以下创建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 "$@"
ej83mcc0

ej83mcc01#

不能在函数中使用全局$@
或者,我使用下面的代码(适合您)。
但之后,我不再使用全局"$@",而是使用global_params变量。

#! /usr/bin/env bash

function modify_params () {
    local -n local_params=$1
    local -a new_local_params=()
    local p=
    # echo "${FUNCNAME[0]}: ${local_params[*]@A}'"
    for p in "${local_params[@]}"; do
        case "$p" in
            -h|--help)
                echo "Help"
                exit
            ;;
            -x|--trace)
                echo "Tracing enabled for ${0##*/}" >&2
                set -o xtrace
            ;;
            *)
                new_local_params+=("${p}")
            ;;
        esac
    done
    local_params=("${new_local_params[@]}")
}

declare -a global_params=("${@}")
shift $#
modify_params global_params
declare -r global_params

echo "global: ${global_params[*]@A}"
cigdeys3

cigdeys32#

真的没有办法做到这一点; $@对于每个函数自动是本地的。
如果您想强制执行,请让函数将结果发送到标准输出,并执行如下操作

set -- $(your function)

在全球范围内。

相关问题