getopts:如何接受与我的脚本中的选项无关的参数?

时间:2016-04-19 01:42:56

标签: linux bash shell unix terminal

我正在编写一个具有以下用法的Bash脚本:

ci-badge -t|-a [-b branch] [-m] [-d description] [-l [link] ] repo

示例:

$ ci-badge -t foo/bar
$ ci-badge -ab dev foo/bar -m
$ ci-badge quux/bar -md 'Hello, world.'

可以在GitHub上找到更多样本here。无论如何,我想知道如何使用getopts为这个脚本实现参数解析。几个小时后查看this基本getopts指南并搜索SO,这是我的代码到目前为止所看到的:

#!/usr/bin/env bash

generate_url=false # set to true if -l is passed with no arg
markdown=false # true -> surround the URL with markdown

# Parse options
while getopts ':tab:md:l:' opt
do
    case "$opt" in
        a) service=appveyor ;;
        b) branch=$OPTARG ;;
        d) description=$OPTARG ;;
        l) url=$OPTARG ;;
        m) markdown=true ;;
        t) service=travis ;;
        # Colon: runs if no args are passed to
        # an option that normally requires parameters.
        :) test "$OPTARG" = l && generate_url=true ;;
        # ?: Runs if an invalid option is passed.
        '?') die ;;
    esac
done

正如您所看到的,大多数功能都存在,但我想知道如何接受repo作为脚本的参数。由于getopts在遇到第一个非选项参数后停止解析,我想知道,我将如何实现这一点(最好具有最小的复杂性)?我之前链接的guide似乎没有提到处理与选项无关的参数,所以我有点迷失。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用$ OPTIND值。在getopts循环后:

shift $((OPTIND-1))
echo $@
echo $1 $2 ...