サブコマンドと長いオプションのみを含むBashスクリプト

サブコマンドと長いオプションのみを含むBashスクリプト

短いオプションの代わりにサブコマンドと長いオプションでgetoptorを使用する方法は?getopts私は短期と長期のオプションを実装する方法を知っています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

関連情報