BASH getopts可选参数

Vil*_*agg 2 unix linux bash shell getopts

我正在尝试创建一个shell脚本,它有两个必需参数(arg1,arg2),然后是一个可选的-b标志加上用户选择使用该标志时需要遵循的参数.

让我解释:

这是一个安装脚本,它利用GIT从Github存储库中获取应用程序.用户键入终端f.ex.:

./shellscript.sh new <app_name> # fetches master branch by default
Run Code Online (Sandbox Code Playgroud)

并且脚本从此存储库中获取主分支的实例.但是,用户是否应该选择使用可选的-b标志,这意味着他/她想要指定要获取的分支,例如开发分支.意味着用户可以这样做:

./shellscript.sh new <app_name> -b develop # or which ever branch there is available
Run Code Online (Sandbox Code Playgroud)

我也很好奇如何使脚本工作,以便用户在'new'参数和'app_name'参数之前键入-b标志+ branch_name并不重要.但这可能不是目前最重要的事情.

要知道我正在尝试构建什么,这里是一个指向我当前脚本的链接,它只接受两个必需参数并且只获取主分支:My Super Cool Artisan Executable Script

PS:我一直在尝试使用getopts的很多例子,我在Stackoverflow和其他博客上都找到了这些例子,但是没有一个帮助我完全使它工作.因此,我在这里向你们所有人寻求帮助.

非常感谢,请务必查看我的Linux Mint/Ubuntu - 仅适用于酷人的安装后脚本(您和那些从Windows/Mac切换到Linux的人)

此致,Villi

cfo*_*ish 5

我通常会自己编写以允许短期和长期期权:

function Usage()
{
cat <<-ENDOFMESSAGE

$0 [OPTION] REQ1 REQ2

options:

    -b -branch  branch to use
    -h --help   display this message

ENDOFMESSAGE
    exit 1
}

function Die()
{
    echo "$*"
    exit 1
}

function GetOpts() {
    branch=""
    argv=()
    while [ $# -gt 0 ]
    do
        opt=$1
        shift
        case ${opt} in
            -b|--branch)
                if [ $# -eq 0 -o "${1:0:1}" = "-" ]; then
                    Die "The ${opt} option requires an argument."
                fi
                branch="$1"
                shift
                ;;
            -h|--help)
                Usage;;
            *)
                if [ "${opt:0:1}" = "-" ]; then
                    Die "${opt}: unknown option."
                fi
                argv+=(${opt});;
        esac
    done 
}

GetOpts $*
echo "branch ${branch}"
echo "argv ${argv[@]}"
Run Code Online (Sandbox Code Playgroud)