繁体   English   中英

在没有getopts的情况下处理shell脚本的标志

[英]Handling flags for a shell script without getopts

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

假设我想实现一些自包含的东西,那有什么选择呢?

这是一种快速而肮脏的方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM