在Bash函数中使用getopts

我想在我在.bash_profile中定义的函数中使用getopts。
这个想法是我想传递一些标志到这个函数来改变它的行为。

这里是代码

function t() {
    echo $*
    getopts "a:" OPTION
    echo $OPTION
    echo $OPTARG
}

当我调用它像这样:

t -a bc

我得到这个输出

-a bc
?

怎么了?我想获得值bc,而不需要手动移动和解析。如何在函数内正确使用getopts?

编辑:更正我的代码片段尝试$ OPTARG,无效

编辑#2:OK结果代码是很好,我的shell不知何故搞乱了。打开一个新窗口解决了。 arg值确实在$ OPTARG中。

正如@Ansgar指出的,你的选项的参数存储在$ {OPTARG},但这不是在函数内使用getopts时唯一需要注意的。您还需要确保$ {OPTIND}是本地的函数,通过取消设置或声明它本地,否则你会遇到意外的行为,当多次调用函数

t.sh:

#!/bin/bash

foo()
{
    foo_usage() { echo "foo: [-a <arg>]" 1>&2; exit; }

    local OPTIND o a
    while getopts ":a:" o; do
        case "${o}" in
            a)
                a="${OPTARG}"
                ;;
            *)
                foo_usage
                ;;
        esac
    done
    shift $((OPTIND-1))

    echo "a: [${a}],non-option arguments: $*"
}

foo
foo -a bc bar quux
foo -x

示例运行:

$ ./t.sh
a: [],non-option arguments:
a: [bc],non-option arguments: bar quux
foo: [-a <arg>]

如果您注释掉#个当地OPTIND,这是您得到的:

$ ./t.sh
a: [],non-option arguments: bar quux
a: [bc],non-option arguments:

除此之外,其用法与在函数外使用时相同。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...