test.sh
다음과 같이 쉘 스크립트를 호출 해야 합니다 .
./test.sh -run/-rerun username password
쉘 스크립트에서 전달된 옵션 -run
이나 옵션이 있는지 어떻게 확인할 수 있나요 ?-rerun
답변1
일반적인 접근 방식은 다음과 같습니다.getopt
보다 쉬운 구문 분석을 위해 스크립트에 전달된 명령줄 옵션을 분석하는 유틸리티입니다. getopt
매개변수 유무에 관계없이 짧은(단일 문자) 및 긴(다중 문자) 옵션을 지원합니다. getopt
호출 시 두 개의 인수가 전달됩니다. getopt
옵션이 구문 분석되는 방식을 수정하는 옵션과 구문 분석할 호출 스크립트에 대한 인수입니다.
나머지 인수를 구문 분석하는 방법을 지정하는 가장 중요한 옵션 getopt
은 다음과 같습니다.
-o, --options shortopts
구문 분석할 짧은 옵션입니다. 이 옵션에 대한 인수는shortopts
문자열이며 짧은 옵션으로 인식되어야 합니다. 필수 매개변수가 있는 옵션 문자 뒤에는 콜론이 와야 하고:
, 선택적 매개변수가 있는 옵션 문자 뒤에는 콜론 두 개가 와야 합니다::
. 예를 들어, 이shortopts
문자열은ab:c::
다음과 같은 인식된 옵션 및 에-a
해당-b arg
합니다-c
.-c arg
이 옵션을 지정하지 않으면 다음getopt
으로 시작하지 않는(옵션 인수도 아닌) 첫 번째 옵션이 문자열로 처리됩니다.-
shortopts
-l, --longoptions longopts
구문 분석할 긴 옵션입니다. 옵션 이름을 쉼표로 구분하여 여러 옵션을 한 번에 지정하거나-l
옵션을 여러 번 지정할 수 있습니다. 필수 및 선택적 매개변수는 옵션 이름 뒤 또는 뒤에 옵션으로-o
표시됩니다 .:
::
-a, --alternative
공동 합의, 특히암소 비슷한 일종의 영양소프트웨어의 한 가지 단점은 긴 옵션 앞에 두 개의 대시(예: )가 붙는다는 것입니다--run
. 이-a
옵션은getopt
긴 옵션이-
단일 문자로 시작될 수 있음을 나타냅니다.-q,--quiet
getopt
인식할 수 없는 옵션을 발견하거나 구문 분석할 인수 중 필수 인수가 누락된 경우getopt: unrecognized option '[option name]'
또는 togetopt: option '[option name'] requires an argument
형식의 메시지를 인쇄하고stderr
일반 출력을 생성한 후stdout
0이 아닌 상태로 종료합니다. 이-q
옵션을 사용하면 오류 메시지를 표시하지 않을 수 있습니다.-n, --name progname
getopt
이 옵션을 사용하면 위 오류를 보고할 때 사용할 프로그램 이름을 지정할 수 있습니다 .
옵션이 아닌 첫 번째 인수(옵션 인수가 아니거나 shortopts
위에서 설명한 대로 문자열로 처리됨)는 getopt
구문 분석할 인수 목록의 시작으로 간주됩니다. 이러한 매개변수의 시작은 로 표시될 수도 있으며 --
, 이 경우 첫 번째 다음 매개변수는 --
구문 분석할 매개변수 목록의 시작으로 간주됩니다.
의 일반적인 출력은 getopt
다음과 같이 인식된 옵션의 확장된 목록입니다.
함께 제공된 짧은 옵션(예: )은
-abc
별도의 옵션으로 확장됩니다-a -b -c
.단일 대시로 시작하는 긴 옵션(예: )
-a
에는 옵션으로 지정된 경우 추가 대시가 앞에 붙습니다 . 즉,getopt
-foo
--foo
옵션의 필수 및 선택적 매개변수는 따옴표로 묶입니다(예:
-b arg
goes 및 be).-b 'arg'
--foo arg
--foo=arg
--foo 'arg'
나머지 매개변수는 따옴표로 묶여 options 와 구분됩니다
--
.
확장의 장점은 고려해야 할 상황이 적기 때문에 분해된 옵션을 구문 분석하기가 더 쉽다는 것입니다. getopt
질문에 지정된 명령줄 옵션을 사용하여 구문 분석된 예는 다음과 같습니다.
#!/bin/bash
OPTS=`getopt -a -l run -l rerun -- "$0" "$@"`
if [ $? != 0 ] # There was an error parsing the options
then
exit 1
fi
eval set -- "$OPTS"
while true; do
case "$1" in
--run) echo "option --run specified"; shift;;
--rerun) echo "option --rerun specified"; shift;;
--) shift; break;;
esac
done
echo "Args:"
for arg # Process remaining arguments
do
echo $arg
done
설명하다:
OPTS=`getopt -a -l run -l rerun -- "$0" "$@"`
OPTS
여기에서는 호출의 출력을 보관할 변수를 설정합니다 getopt
. 이 경우 여기에 전달된 매개변수는 getopt
셸에서 설정한 내장 변수입니다. 스크립트 이름을 bash
저장 하고 스크립트에 전달된 모든 명령줄 인수(개별적으로 인용)를 저장합니다. 인수는 지정된 옵션에 따라 처리됩니다. 이 예에서는 매개변수가 없는 긴 옵션이 인식됩니다 . 이 옵션은 테이블 과 . 호출 결과는 확장된 매개변수 목록입니다. 예를 들어, 와 같은 스크립트 호출은 셸에 의한 호출 로 확장됩니다 . 확장된 매개변수는 순서대로 출력됩니다 .$0
$@
getopt
getopt
--run
--rerun
-a
getopt
-run
-rerun
getopt
test.sh -run username password
getopt
getopt -a -l run -l rerun -- "test.sh" "-run" "username" "password"
getopt
--run -- 'username' 'password'
if [ $? != 0 ] # There was an error parsing the options
then
exit 1
fi
내장 변수는 $?
가장 최근에 실행된 명령의 반환 값을 보유합니다. 0이 아닌 반환 값은 getopt
오류가 발생했음을 나타냅니다.
eval set -- "$OPTS"
이는 실제로 스크립트에 전달된 원래 명령줄 인수를 에서 출력한 확장된 인수로 대체합니다 getopt
.
while true; do
case "$1" in
--run) echo "option --run specified"; shift;;
--rerun) echo "option --rerun specified"; shift;;
--) shift; break;;
esac
done
$1
루프는 첫 번째 위치 인수부터 시작하여 각 위치 인수를 순서대로 처리합니다. 확장 후에는 getopt
세 가지 경우만 고려하면 됩니다. 처리가 끝나면 각 케이스는 , , 등 의 위치 shift
매개변수를 변경합니다 . 따라서 위치 매개변수는 루프가 반복될 때마다 새로운 값을 유지합니다.$2
$1
$3
$2
$1
처리 중인 옵션에 필수 매개변수가 필요한 경우 case
위치 매개변수를 통해 명령문에서 매개변수 값에 액세스할 수 있습니다 $2
. 옵션과 해당 인수가 처리될 때 두 옵션을 제거하려면 위치 매개변수를 2만큼 이동해야 합니다.그리고논쟁.
a가 인식된 옵션 뒤, 나머지 인수 앞에 출력되는 경우 getopt
, 케이스는 옵션 목록의 끝과 루프의 종료 조건을 나타냅니다.--
--
while
echo "Args:"
for arg # Process remaining arguments
do
echo $arg
done
for arg
응 줄임말 for arg in "$@"
. while
루프 후에 는 shift
이제 각 사례로 인해 출력 $@
후반부의 나머지 매개변수 만 저장됩니다.--
getopt