处理没有getopts的shell脚本的标志

时间:2014-03-14 01:25:24

标签: shell posix

我为/bin/sh posix shell创建了一个脚本,使用getopts实用程序处理标志,现在我意识到它可能不是我的最佳选择,它是一个外部依赖,最后它甚至不是那么灵活,它可能适用于1个字符长的标记,但我想使用更多“冗长”和直观的标记,如--config--value-for-a=42

假设我想实现自包含的东西,还有什么选择?

1 个答案:

答案 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进行测试