Unixシステムのマルチ文字オプション

Unixシステムのマルチ文字オプション

複数の文字オプションをサポートする必要があるユースケースがあります。現在私はgetoptsの単一文字オプションを使用しています。複数文字オプションが望ましい。これを行う最良の方法は何ですか?このユースケースについて手動パーサーを実装する記事を見たことがありますが、これはパフォーマンスに最適ですか?

-ab のようなものが -a -b の代わりに -ab として処理されることを望みます。これも良いコーディング習慣ですか?

これは、オプションに関する完全な情報を提供しない単一文字オプションではなく、オプションをより意味のあるものにするためです。

重要:これらの複数文字オプションを持つoptargsも必要です。例 -ab "sdfd" 。

これはコードです

while getopts ":s:p:q:j:o" opt; do
  case ${opt} in
    s)
      only_save=TRUE
      new_tok=$OPTARG
      ;;
    p)
      only_upload_enum_json=TRUE
      enum="job_status"
      new_tok=$OPTARG
      ;;
    q)
      only_upload_enum_json=TRUE
      enum="lifecycle_state"
      new_tok=$OPTARG
      ;;
    j)
      only_download_enum_json=TRUE
      enum=$OPTARG
      ;;
    o)
      only_download=TRUE
      ;;
    \?)
      echo "   -s <token>"
      echo "   -p <token>"
      echo "   -q <token>"
      echo "   -j <enum_name>"
      echo "   -o <no value needed>"
      exit;
      ;;
  esac
done

ここでjob_statusについては、-pの代わりに-jsを使用する方がもう少し意味があります。 lifecycle_stateも同様です。

ベストアンサー1

個人的には、getopt代わりに以下のshell-script-templateという関数を使用します。getoptsoption_handling

オプションを介してパラメーターを渡すには、次のようにします。

オプションが-z 'something'と仮定すると...

[...]
--options hVvz:
[...]
-z)args="$2"; shift2;;

見たい場合は、プレインストールしておく必要が/usr/share/doc/util-linux/examples/getopt-parse.bashあります。

テンプレートは次のとおりです。

#!/usr/bin/env -S bash - 
#===============================================================================
#
#          FILE: <<filename here>>
#
#         USAGE: 
#
#   DESCRIPTION: 
#
#       OPTIONS: ---
#  REQUIREMENTS: ---
#          BUGS: ---
#         NOTES: ---
#        AUTHOR: 
#  ORGANIZATION: 
#       CREATED: 
#       LICENSE: BSD-3-CLAUSE
#      REVISION:  ---
#===============================================================================

#=== Init ======================================================================
set -o nounset   # exit on unset variables.
set -o errexit   # exit on any error.
set -o errtrace  # any trap on ERR is inherited
#set -o xtrace    # show expanded command before execution.

unalias -a       # avoid rm being aliased to rm -rf and similar issues
LANG=C           # avoid locale issues
VERBOSE=         # Don't be verbose, unless given '-v'-option

ScriptVersion="1.0"

trap "cleanup" EXIT SIGTERM

#=== Functions =================================================================
usage (){
  echo "

  Usage :  ${0##/*/} [options] [--]

  Options:
  -h|--help     Display this message
  -V|--version  Display script version
  -v|--verbose  Print informational text

  "
  exit 0
}    # ----------  end of function usage  ----------

option_handling () {
  # see /usr/share/doc/util-linux/examples/getopt-parse.bash
  OPTS=$(getopt --name "$0" \
    --options hVv \
    --longoptions help,version,verbose \
    --shell bash \
    -- "$@") \
    || (echo; echo "See above and try \"$0 --help\""; echo ; exit 1)

  eval set -- "$OPTS"
  unset OPTS

  while true ; do
    case "$1" in
      -h|--help)
        usage
        ;;
      -V|--version)
        echo "$0 -- Version $ScriptVersion"; exit 0
        ;;
      -v|--verbose)
        VERBOSE=true
        shift
        ;;
      --)
        shift ; break
        ;;
      *)
        echo "I don't know what to do with \"$1\". Try $0 --help"
        exit 1
        ;;
    esac
  done
} # ----------  end of function option_handling  ----------

cleanup () { # Will be called by the trap above, no need to call it manually.
  :
} # ----------  end of function cleanup  ----------

# see https://github.com/markgraf/flatten.sh about this
. ~/scripting/library.bash/lazy.lib

#=== Main ======================================================================
main () {
  option_handling "$@"

  

} # ----------  end of function main  ----------

main "$@"

#=== End =======================================================================

おすすめ記事