有没有办法避免在bash中的位置参数?

前端之家收集整理的这篇文章主要介绍了有没有办法避免在bash中的位置参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我必须在bash中写一个函数。该函数将需要大约7个参数。我知道我可以调用这样的函数

使用参数调用函数

function_name $arg1 $arg2

我可以参考我的参数像这样里面的函数

function_name () {
   echo "Parameter #1 is $1"
}

我的问题是,有没有更好的方式参考函数里面的参数?我可以避免$ 1,$ 2,$ 3,….事情,只需使用$ arg1,$ arg2,…?

有没有适当的方法,或者我需要重新分配这些参数到函数内的其他一些变量?例如。:

function_name () {
   $ARG1=$1
   echo "Parameter #1 is $ARG1"
}

任何例子将不胜感激。

这样做的常见方式是将参数分配给函数中的局部变量,即:
copy() {
    local from=${1}
    local to=${2}

    # ...
}

另一个解决方案可能是getopt样式选项解析。

copy() {
    local arg from to
    while getopts 'f:t:' arg
    do
        case ${arg} in
            f) from=${OPTARG};;
            t) to=${OPTARG};;
            *) return 1 # illegal option
        esac
    done
}

copy -f /tmp/a -t /tmp/b

可悲的是,bash不能处理更多可读的长选项,例如:

copy --from /tmp/a --to /tmp/b

为此,你需要使用外部getopt程序(我认为只有在GNU系统上有长选项支持)或手动实现长选项解析器,例如:

copy() {
    local from to

    while [[ ${1} ]]; do
        case "${1}" in
            --from)
                from=${2}
                shift
                ;;
            --to)
                to=${2}
                shift
                ;;
            *)
                echo "Unknown parameter: ${1}" >&2
                return 1
        esac

        if ! shift; then
            echo 'Missing parameter argument.' >&2
            return 1
        fi
    done
}

copy --from /tmp/a --to /tmp/b

另见:using getopts in bash shell script to get long and short command line options

你也可以是惰性的,只是将“变量”作为参数传递给函数,例如:

copy() {
    local "${@}"

    # ...
}

copy from=/tmp/a to=/tmp/b

并且在函数中有$ {from}和$ {to}作为局部变量。

请注意,同样的问题适用于 – 如果一个特定的变量不被传递,它将从父环境继承。您可能想要添加“安全线”,如:

copy() {
    local from to    # reset first
    local "${@}"

    # ...
}

以确保$ {from}和$ {to}在未通过时将被取消设置。

如果非常糟糕的事情是你的兴趣,你也可以在调用函数时将参数指定为全局变量,例如:

from=/tmp/a to=/tmp/b copy

然后你可以在copy()函数中使用$ {from}和$ {to}。只要注意,你应该总是传递所有参数。否则,随机变量可能泄漏到函数中。

from= to=/tmp/b copy   # safe
to=/tmp/b copy         # unsafe: ${from} may be declared elsewhere

如果你有bash 4.1(我认为),你也可以尝试使用关联数组。它将允许你传递命名参数,但它会是丑陋的。就像是:

args=( [from]=/tmp/a [to]=/tmp/b )
copy args

然后在copy(),你需要grab the array

猜你在找的Bash相关文章