我正在编写一个具有以下用法的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似乎没有提到处理与选项无关的参数,所以我有点迷失。
感谢您的帮助!
答案 0 :(得分:0)
使用$ OPTIND值。在getopts循环后:
shift $((OPTIND-1))
echo $@
echo $1 $2 ...