命名参数在shell函数中不起作用

命名参数在shell函数中不起作用,shell,getopts,Shell,Getopts,我有一个shell脚本,它应该从命令行接受两个可选参数start和end: function foo { # -s : start # -e : end while getopts 's:e:' arg do case ${arg} in s) start=${OPTARG};; e) end=${OPTARG};; *) return 1 # illegal option

我有一个shell脚本,它应该从命令行接受两个可选参数
start
end

function foo {
    # -s : start
    # -e : end
    while getopts 's:e:' arg
    do
        case ${arg} in
            s) start=${OPTARG};;
            e) end=${OPTARG};;
            *) return 1 # illegal option
        esac
    done

    echo "start, end:"
    echo $start, $end

    unset start
    unset end
}
我从跑步中得到随机结果。以下是运行列表(按时间顺序)及其输出:

一,

二,

三,

四,

五,

六,

七,

八,


请帮忙。这个要求就像这篇文章的前两行一样简单。任何替代方法都可以,但我很想知道我做错了什么。TIA。

由于调用了getopts,您的函数将设置全局变量
OPTIND
。您可以通过在函数开头添加
local OPTIND
来防止这种情况(您可能希望对变量
end
start
也这样做)

$ foo
start, end:
,
$ foo -s 2011
start, end:
2011,
$ foo -e 2015
start, end:
,
$ foo -s 2011 -e 2016
start, end:
, 2016
$ foo -s 2011 -e 2016
start, end:
,
$ foo
start, end:
,
$ foo -s 2011 -e 2016
start, end:
2011, 2016
$ foo -s 2011 -e 2016
start, end:
,