사용하다 getopt
왜 getopt?
혼동을 피하기 위해 정교한 명령 행 인수를 구문 분석하고 구문 분석중인 옵션을 명확하게하여 명령을 읽는 사람이 현재 상황을 이해할 수 있도록합니다.
getopt 란 무엇입니까?
getopt
쉘 프로 시저로 쉽게 구문 분석하고 법적 옵션을 확인하기 위해 명령 행에서 옵션을 분류 (구문 분석)하는 데 사용됩니다. 이를 위해 GNU getopt(3)
루틴을 사용합니다 .
getopt
다음과 같은 유형의 옵션을 가질 수 있습니다.
- 무가치 옵션
- 키-값 쌍 옵션
참고 :이 문서에서 구문을 설명하는 동안 :
- [] 안에있는 것은 구문 / 예시의 선택적 매개 변수입니다.
- 자리 표시 자이므로 실제 값으로 대체해야합니다.
사용하는 방법 getopt
?
구문 : 첫 번째 양식
getopt optstring parameters
예 :
# This is correct
getopt "hv:t::" "-v 123 -t123"
getopt "hv:t::" "-v123 -t123" # -v and 123 doesn't have whitespace
# -h takes no value.
getopt "hv:t::" "-h -v123"
# This is wrong. after -t can't have whitespace.
# Only optional params cannot have whitespace between key and value
getopt "hv:t::" "-v 123 -t 123"
# Multiple arguments that takes value.
getopt "h:v:t::g::" "-h abc -v 123 -t21"
# Multiple arguments without value
# All of these are correct
getopt "hvt" "-htv"
getopt "hvt" "-h -t -v"
getopt "hvt" "-tv -h"
여기서 h, v, t는 옵션이고 -h -v -t는 명령 줄에서 옵션을 제공하는 방법입니다.
- 'h'는 값이없는 옵션입니다.
- 'v :'는 옵션 -v에 값이 있으며 필수 옵션임을 의미합니다. ':'은 값이 있음을 의미합니다.
- 't ::'는 옵션 -t에 값이 있지만 선택 사항임을 나타냅니다. '::'은 선택 사항을 의미합니다.
선택적 param에서 value는 옵션으로 공백을 구분할 수 없습니다. 따라서 "-t123"예에서 -t는 옵션 123이 값입니다.
구문 : 두 번째 양식
getopt [getopt_options] [--] [optstring] [parameters]
여기서 getopt가 다섯 부분으로 분할 된 후
- 명령 자체, 즉 getopt
- getopt_options는 인수를 구문 분석하는 방법을 설명합니다. 단일 대시 길이 옵션, 이중 대시 옵션.
- -, 구문 분석하려는 옵션과 허용되는 짧은 옵션에서 getopt_options를 분리합니다.
- 짧은 옵션은-가 발견 된 직후에 사용됩니다. 양식 첫 구문과 같습니다.
- 매개 변수는 프로그램에 전달한 옵션입니다. 구문 분석하고 실제 값을 설정하려는 옵션.
예
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
구문 : 세 번째 양식
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
여기서 getopt가 다섯 부분으로 분할 된 후
- 명령 자체, 즉 getopt
- getopt_options는 인수를 구문 분석하는 방법을 설명합니다. 단일 대시 길이 옵션, 이중 대시 옵션.
- 짧은 옵션, 즉 -o 또는 --options. 양식의 첫 번째 구문과 동일하지만 옵션 "-o"및 "-"(이중 대시) 앞에
- -, 구문 분석하려는 옵션과 허용되는 짧은 옵션에서 getopt_options를 분리합니다.
- 매개 변수는 프로그램에 전달한 옵션입니다. 구문 분석하고 실제 값을 설정하려는 옵션.
예
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options는 명령 행 매개 변수의 구문 분석 방법을 변경합니다.
다음은 getopt_options 중 일부입니다
옵션 : -l 또는 --longoptions
getopt 명령은 다중 문자 옵션을 인식 할 수 있어야 함을 의미합니다. 여러 옵션은 쉼표로 구분됩니다.
예를 들어, --name=Karthik
명령 행에서 전송 된 긴 옵션입니다. getopt에서 긴 옵션의 사용법은
getopt "name:,version" "--name=Karthik"
name :이 지정되었으므로 옵션에 값이 포함되어야합니다
옵션 : -a 또는 --alternative
getopt 명령은 long 옵션에 이중 대시 '-'가 아닌 단일 대시 '-'가 있어야 함을 의미합니다.
예, 대신에게 --name=Karthik
당신은 사용할 수 있습니다-name=Karthik
getopt "name:,version" "-name=Karthik"
코드가 포함 된 완전한 스크립트 예제 :
#!/bin/bash
# filename: commandLine.sh
# author: @theBuzzyCoder
showHelp() {
# `cat << EOF` This means that cat should stop reading when EOF is detected
cat << EOF
Usage: ./installer -v <espo-version> [-hrV]
Install Pre-requisites for EspoCRM with docker in Development mode
-h, -help, --help Display help
-v, -espo-version, --espo-version Set and Download specific version of EspoCRM
-r, -rebuild, --rebuild Rebuild php vendor directory using composer and compiled css using grunt
-V, -verbose, --verbose Run script in verbose mode. Will print out each step of execution.
EOF
# EOF is found above and hence cat command stops reading. This is equivalent to echo but much neater when printing out.
}
export version=0
export verbose=0
export rebuilt=0
# $@ is all command line parameters passed to the script.
# -o is for short options like -v
# -l is for long options with double dash like --version
# the comma separates different long options
# -a is for long options with single dash like -version
options=$(getopt -l "help,version:,verbose,rebuild,dryrun" -o "hv:Vrd" -a -- "$@")
# set --:
# If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters
# are set to the arguments, even if some of them begin with a ‘-’.
eval set -- "$options"
while true
do
case $1 in
-h|--help)
showHelp
exit 0
;;
-v|--version)
shift
export version=$1
;;
-V|--verbose)
export verbose=1
set -xv # Set xtrace and verbose mode.
;;
-r|--rebuild)
export rebuild=1
;;
--)
shift
break;;
esac
shift
done
이 스크립트 파일을 실행 :
# With short options grouped together and long option
# With double dash '--version'
bash commandLine.sh --version=1.0 -rV
# With short options grouped together and long option
# With single dash '-version'
bash commandLine.sh -version=1.0 -rV
# OR with short option that takes value, value separated by whitespace
# by key
bash commandLine.sh -v 1.0 -rV
# OR with short option that takes value, value without whitespace
# separation from key.
bash commandLine.sh -v1.0 -rV
# OR Separating individual short options
bash commandLine.sh -v1.0 -r -V
-s
위치 인수로 지정하십시오./myscript 45 anystring
.