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

时间:2015-06-24 09:30:14

标签: shell getopts

我有这个shell脚本应该从命令行接受两个可选参数startend

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
}

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

1

$ foo
start, end:
,

2

$ foo -s 2011
start, end:
2011,

3

$ foo -e 2015
start, end:
,

4

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

5

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

6

$ foo
start, end:
,

7

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

8

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

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

1 个答案:

答案 0 :(得分:1)

由于调用getopts,您的函数设置了全局变量OPTIND。您可以通过在函数开头添加local OPTIND来阻止此操作(您可能希望对变量endstart执行此操作)。