Bash函数如何检测它是否与位置或命名参数一起使用?

时间:2013-12-17 19:19:28

标签: bash function parsing position named-parameters

我正在编写一个Bash函数,它能够尝试使用位置或命名参数,从而以通常的"${1}""${2}"方式访问位置参数,并访问命名参数使用getopts。我有一些示例代码和示例用法如下所示,以说明我正在尝试做什么。问题是我对变量${*}进行的检查只是字符-的一个grep,这极大地限制了其他参数的字符内容。在Bash中检查命名参数的更聪明或更健壮的方法是什么?

示例代码:

function1(){
    # flags
        argumentsFlag1=""
            # n: named arguments
            # p: positional arguments
        verboseFlag1="0"
            # v: verbose
        silentFlag1="0"
            # 0: standard output
            # 1: no standard output
    # options and arguments
        # Determine if positional or named arguments are used.
            # If the arguments contain "-", then named arguments are assumed,
            # otherwise positional arguments are assumed.
                if [ "$(echo "${*}" | grep "-")" ]; then
                    argumentsFlag1="n"
                else
                   argumentsFlag1="p"
                fi
        # handle named arguments
            if [ "${argumentsFlag1}" == "n" ]; then
                OPTIND=1; while getopts "i:sv" options; do
                    case "${options}" in
                        i)
                            input1="${OPTARG}"
                            ;;
                        v)
                            verboseFlag1=1
                            ;;
                        s)
                            silentFlag1=0
                            ;;
                        \?)
                            echo "invalid option -"${OPTARG}""
                            return
                            ;;
                        :)
                            echo "option -"${OPTARG}" requires an argument"
                            return
                            ;;
                    esac
                done
        # handle positional arguments
            elif [ "${argumentsFlag1}" == "p" ]; then
                input1="${1}"
        fi
    # default values
        if [ -z "${verboseFlag1}" ]; then
            verboseFlag1=0
        fi
# ------------------------------------------------------------------------------
    if  [ "${argumentsFlag1}" == "n" ]; then
        echo "named arguments assumed"
    elif [ "${argumentsFlag1}" == "p" ]; then
        echo "positional arguments assumed"
    fi
    echo "input: "${input1}""
}

示例用法:

$ function1 zappo
positional arguments assumed
input: zappo

$ function1 -i zappo
named arguments assumed
input: zappo

编辑:请注意,我不是在尝试同时使用位置和命名参数 。我试图让函数有一个状态,它只是将参数解释为位置或仅由getopts解释为位置和命名参数的混合。可能存在未使用getopts的情况。想象一下以下想法......

我有一个从一种数据类型到另一种数据类型的函数。此功能有两种模式:

快速模式

此模式可以采用以下方式使用:

function fileName1 fileName2

它使用内部假设和自主测量将一个文件转换为另一个文件。

高级模式

此模式可以采用以下方式使用:

function -i fileName1 -o fileName2 -m -r 100 -v

此模式中可能存在位置参数,但它们必须放在getopts位置选项和参数之后。

1 个答案:

答案 0 :(得分:4)

使用getopts处理任何命名参数,并在执行此操作时将其从堆栈中移出。如果之后仍然存在,那么它们就是你的位置论证。

相关问题