我为/bin/sh
posix shell创建了一个脚本,使用getopts
实用程序处理标志,现在我意识到它可能不是我的最佳选择,它是一个外部依赖,最后它甚至不是那么灵活,它可能适用于1个字符长的标记,但我想使用更多“冗长”和直观的标记,如--config
或--value-for-a=42
。
假设我想实现自包含的东西,还有什么选择?
答案 0 :(得分:1)
这是一种快速而肮脏的方法:
AAA=default
# example: BBB left unspecified so you can optionally override from environment
XYZ=${XYZ:-0} # optional so you could override from environment
ABC=${ABC:-0}
while test $# -gt 0 ; do
# switches
if test "$1" = "--flag-xyz" ; then XYZ=1 ; shift ; continue; fi
if test "$1" = "--flag-abc" ; then ABC=1 ; shift ; continue; fi
# options with arguments
case "$1" in
--option-aaa=*) AAA="${1##--option-aaa=}" ; shift; continue; break ;;
--option-bbb=*) BBB="${1##--option-bbb=}" ; shift; continue; break ;;
esac
# unknown - up to you - positional argument or error?
echo "Unknown option $1"
shift
done
根据需要自定义。
此方法的优点是它与顺序无关,如果需要,您可以在语法中调整边缘情况的选项。而且这很简单。
如果您需要强制执行排序,请在需要时从相关的while语句中断处理,将处理分解为多个语句。
下行是有一些重复,getopt有时会避免。
编辑:更改[==]和-gt进行测试