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 =======================================================================

관련 정보