getopt를 사용하여 선택적 입력 매개변수가 있는 bash 스크립트

getopt를 사용하여 선택적 입력 매개변수가 있는 bash 스크립트

코드를 복사했습니다tutorialspoint의 getopt 기사다음 스크립트가 작동하도록 했습니다(약간):


##argument_script.sh
VARS=`getopt -o i::o:: --long input::,output:: -- "$@"`
eval set -- "$VARS"

# extract options and their arguments into variables.
while true ; do
    case "$1" in

        -i|--input)
            case "$2" in
                "") MAPPE='/default/input/here/' ; shift 2 ;;
                *) MAPPE=$2 ; shift 2 ;;
            esac ;;
        
            -o|--output)
            case "$2" in
                "") OUTPUTFOLDER='/default/input/here/' ; shift 2 ;;
                *) OUTPUTFOLDER=$2 ; shift 2 ;;
        esac ;;
        --) shift ; break ;;
    esac
done

echo "${MAPPE}"
echo "${OUTPUTFOLDER}"

#do something here..

즉, 두 개의 선택적 매개변수 플래그 -i/ --input-o/ 가 있습니다 -output. 현재 스크립트에 문제가 있습니다.

플래그의 기본값을 재정의하려면 플래그 뒤에 공백 없이 원하는 값을 써야 합니다. 예: /c/into -i/f/into 에 전달하려면 -o다음과 같이 스크립트를 호출해야 합니다 bash argument_script.sh -i/c/ -o/f/. 누락된 공백을 확인하세요. bash argument_script.sh -i /c/ -o /f/변수를 작성하려면 기본값이 사용 MAPPE됩니다 OUTPUTFOLDER.
스크립트를 다시 작성할 수 있으므로 -i/에 전달된 매개변수를 -o공백 뒤에 작성해야 합니까?(예: bash argument_script.sh -i /c/ -o /f/)

답변1

당신 이 설명하는 동작은 당신 의 :.getoptgetopt

VARS=`getopt -o i:o: --long input:,output: -- "$@"`

그러나 이것은 스크립트를 작성하는 매우 매우 복잡한 방법입니다. 다음은 더 간단한 버전입니다(변수를 대문자로 사용하는 것과 같은 일부 나쁜 관행도 수정함).

#!/bin/bash

##argument_script.sh
vars=$(getopt -o i:o: --long input:,output: -- "$@")
eval set -- "$vars"

mappe='/default/input/here/'
outputFolder='/default/input/here/'

# extract options and their arguments into variables.
for opt; do
    case "$opt" in
      -i|--input)
        mappe=$2
        shift 2
        ;;
      -o|--output)
        outputFolder=$2
        shift 2
        ;;
    esac
done
echo "mappe: $mappe"
echo "out: $outputFolder"

이제 다음을 수행할 수 있습니다.

$ ./argument_script.sh -i /c/  -o /f/
mappe: /c/
out: /f/

실행하는 경우에도 이 기능이 작동한다는 점에 유의하세요 ./argument_script.sh -i/c/ -o/f/. 이 공간은 필수는 아니지만 허용됩니다.

답변2

불행하게도 이는 예상된 동작이며 getopt(3)getopt(1)유틸리티의 기반이 되는 GNU 함수에 의해 구현됩니다. 맨페이지에서 (강조):

두 개의 콜론은 텍스트가 있는 경우 선택적 매개변수가 있는 옵션을 나타냅니다. 현재 argv요소 내(예: 옵션 이름 자체와 동일한 단어, 예: -oarg), 반환됨 optarg, 그렇지 않으면 optarg0으로 설정됩니다.

옵션과 인수 사이에 공백을 사용하려면(예: -o value대신 -ovalue) 인수를 만들어야 합니다.선택사항이 아닌:, 사양의 옵션 문자 뒤에 단일을 사용합니다.

관련 정보