Linux 读取函数内的选项并将其作为值返回

Linux 读取函数内的选项并将其作为值返回,linux,bash,getopts,Linux,Bash,Getopts,我正在尝试编写一个函数来解析我的参数。下面是它的样子: opts_get(){ CONFIG=() while getopts "f:" opt; do case $opt in f) CONFIG=$OPTARG ;; :) echo "Option -$OPTARG requires argument" 1>&a

我正在尝试编写一个函数来解析我的参数。下面是它的样子:

opts_get(){
    CONFIG=()
    while getopts "f:" opt; do
        case $opt in
            f)
                CONFIG=$OPTARG
                ;;
            :)
                echo "Option -$OPTARG requires argument" 1>&2
                exit 1
                ;;
            \?)
                echo "Invalid option -$OPTARG" 1>&2
                exit 1
                ;;
        esac
    done
    echo $CONFIG
}

echo $(opts_get)
但不幸的是,即使我通过了
-f sdf
选项,它也会打印空行

如果我把读取选项代码放在任何函数之外

CONFIG=()
while getopts "f:" opt; do
    case $opt in
        f)
            CONFIG=$OPTARG
            ;;
        :)
            echo "Option -$OPTARG requires argument" 1>&2
            exit 1
            ;;
        \?)
            echo "Invalid option -$OPTARG" 1>&2
            exit 1
            ;;
    esac
done
echo $CONFIG #prints what I want

您没有将参数传递给函数。您需要将它从脚本传递到函数,如下所示

echo $(opts_get "$@")
第二种情况之所以有效,是因为命令行中的位置参数由
getopts
直接读取。还要将变量初始化修改为仅
CONFIG=”“
,而不是作为数组声明


您还需要通过取消设置函数或将其声明为本地,确保函数的
${OPTIND}
是本地的,否则在多次调用函数时会遇到意外行为。

因此,如果函数是从另一个函数调用的。我应该先把参数传递给调用者函数,对吗?你是什么意思$
{OPTIND}
?@St.Antario:是的absolutely@St.Antario:它包含要处理的下一个参数的索引,如果您仅使用一个参数,则没有问题