仅包含子命令和长选项的 Bash 脚本

仅包含子命令和长选项的 Bash 脚本

如何将getoptorgetopts与子命令和长选项一起使用,而不是与短选项一起使用?我知道如何使用 来实现短期和长期选项getopts。到目前为止,我发现的解决方案是getopts在子命令 switch-case 中使用,但选项很短,例如:

https://stackoverflow.com/questions/402377/using-getopts-to-process-long-and-short-command-line-options

使用 getopts 解析非选项参数后的选项

例如,我如何实现以下子命令及其长选项?:

 $> ./myscript.sh help
show
show --all
set
set --restart
reset
reset --restart
help

答案1

在函数中手动解析它们,并使用"$@".调用后,任何剩余的非选项都位于$1$2等中。请注意,在本例中,我使用关联数组来保存开关。如果您没有 bash 3 或更高版本,则可以使用全局变量。

子命令将是 args[0] 及其其余选项。

usage() { 
  echo "${0##*/} [options...] args ... "
}
version() { 
  echo "0.1"
}

parse_opt() {
  while [[ -n "$1" ]]; do
    case "$1" in
    --) break ;; 
    
    ## Your options here:
    -m) opts[m]=1 ;;
    -c|--center) opts[c]="$2" ; shift ;;
    -x) opts[x]=1 ;;

    ## Common / typical options
    -V) version; exit 0 ;;
    --version) 
        version; exit 0 ;;
    -?|--help)
        usage ; exit 0 ;;
    -*)
        echo >&2 "$0: Error in usage."
        usage
        exit 1
        ;;
    *)  break ;;
    esac
    shift
  done
  args=("$@")
}

declare args
declare -A opts # assoc array
parse_opt "$@"

case "${args[0]}" in
  sub1)  
    "${args[@]}" ;;
  *) 
    echo >&2 "Unknown sub-command"
    exit 1
esac

相关内容