-option 및 매개변수를 사용하여 쉘 스크립트 호출

-option 및 매개변수를 사용하여 쉘 스크립트 호출

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,--quietgetopt인식할 수 없는 옵션을 발견하거나 구문 분석할 인수 중 필수 인수가 누락된 경우 getopt: unrecognized option '[option name]'또는 to getopt: option '[option name'] requires an argument형식의 메시지를 인쇄하고 stderr일반 출력을 생성한 후 stdout0이 아닌 상태로 종료합니다. 이 -q옵션을 사용하면 오류 메시지를 표시하지 않을 수 있습니다.

  • -n, --name prognamegetopt이 옵션을 사용하면 위 오류를 보고할 때 사용할 프로그램 이름을 지정할 수 있습니다 .

옵션이 아닌 첫 번째 인수(옵션 인수가 아니거나 shortopts위에서 설명한 대로 문자열로 처리됨)는 getopt구문 분석할 인수 목록의 시작으로 간주됩니다. 이러한 매개변수의 시작은 로 표시될 수도 있으며 --, 이 경우 첫 번째 다음 매개변수는 --구문 분석할 매개변수 목록의 시작으로 간주됩니다.

의 일반적인 출력은 getopt다음과 같이 인식된 옵션의 확장된 목록입니다.

  • 함께 제공된 짧은 옵션(예: )은 -abc별도의 옵션으로 확장됩니다 -a -b -c.

  • 단일 대시로 시작하는 긴 옵션(예: ) -a에는 옵션으로 지정된 경우 추가 대시가 앞에 붙습니다 . 즉,getopt-foo--foo

  • 옵션의 필수 및 선택적 매개변수는 따옴표로 묶입니다(예: -b arggoes 및 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$@getoptgetopt--run--rerun-agetopt-run-rerungetopttest.sh -run username passwordgetoptgetopt -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

관련 정보