在Bash中,为什么在函数中使用getopts只能工作一次?

时间:2017-02-20 04:34:31

标签: bash getopts

我试图在macOS Sierra上创建一个简单的函数来计算字符串中的字符。这很好用(添加到我的bashrc文件中):

function cchar() {
    str=$1
    len=${#str}
    echo "string is $len char long"
}

$ cchar "foo"
string is 3 char long

我尝试使用-a选项扩展它,所以我将其添加到我的函数中(并将其余部分注释用于测试):

while getopts "a:" opt; do
    case $opt in
        a)
            echo "-a param: $OPTARG" >&2
            ;;
    esac
done

在写完这篇文章后进行了一些测试,我发现每次运行cchar -a "test"时都会注意到,我必须在没有选项(cchar)的情况下运行它,否则下次我用{{-a运行它时1}}选项,它不识别该选项。

$ cchar

$ cchar -a "foo"
-a param: foo

$ cchar -a "foo"

$ cchar

$ cchar -a "foo"
-a param: foo

2 个答案:

答案 0 :(得分:6)

您必须重置变量OPTIND,它会跟踪当前位置参数号。它应该足以让你的函数本地变量。

答案 1 :(得分:0)

我最终使用的最终代码:

# Count characters in a string
function cchar() {
    local OPTIND

    while getopts "a:" opt; do
        case $opt in
            a)
                echo ${#OPTARG}
                return
                ;;
        esac
    done

    echo "string is ${#1} characters long"
}

$ cchar "foo bar"
string is 7 characters long

$ cchar -a "foo bar"
7

注意:我必须使用return代替exit,当来自.bashrc时,exit会关闭当前的shell。