Bash 스크립트에서 순서 독립적 옵션을 구현하는 표준 방법은 무엇입니까? [복사]

Bash 스크립트에서 순서 독립적 옵션을 구현하는 표준 방법은 무엇입니까? [복사]

중복 가능성:
쉘 스크립트에서 스위치를 처리하는 방법은 무엇입니까?

가장 일반적인 쉘 명령을 사용하면 사용자는 임의의 순서로 옵션을 지정할 수 있습니다. $1반면에 bash에서 일반적으로 사용되는 위치 매개변수(저는 모든 스크립트를 Bash로 작성하는 경향이 있지만 이 질문이 실제로 Bash에만 해당되는 것은 아니라고 생각합니다)와 같이 스크립트는 순서에 따라 다릅니다.

이제 난 알아낼 수 있어일부선택적 인수를 제공할 때 bash 스크립트 사용자가 특정 순서를 따르도록 요구하지 않는 방법입니다. (확장자에 특정 옵션이 있는지 테스트하기 위해 정규식이나 전역 변수를 사용하려고 생각했습니다 $@.) 그러나 그러한 옵션을 구현하는 특별히 표준적인 방법이 있는지 알고 싶습니다. 옵션의 공통 구문(예: -r많은 쉘 명령)을 고려하면 분명히 있어야 한다고 생각합니다.

답변1

getopt주어진 매개변수의 모든 순서를 지원 합니다 getopts. 사용하기 쉽고 매개변수 구문 분석을 위한 표준 솔루션으로 보입니다.

자주 언급되는 두 가지 차이점은 다음과 같습니다.

  • getopt긴 옵션을 지원합니다 --help.
  • getopts독립형 프로그램이 아닌 내장 Bash 쉘입니다.

광범위한 단순화:

# Process parameters
params="$(getopt -o e:hv \
    -l exclude:,help,verbose \
    --name "$0" -- "$@")"

if [ $? -ne 0 ]
then
    usage
fi

eval set -- "$params"
unset params

while true
do
    case $1 in
        -e|--exclude)
            excludes+=("${2-}")
            shift 2
            ;;
        -h|--help)
            usage
            exit
            ;;
        -v|--verbose)
            verbose='--verbose'
            shift
            ;;
        --)
            shift
            if [ -z "${1:-}" ]
            then
                error "Missing targets." "$help_info" $EX_USAGE
            fi
            if [ -z "${2:-}" ]
            then
                error "Missing directory." "$help_info" $EX_USAGE
            fi
            targets=(${@:1:$(($#-1))})
            source_dir="${@:$#}"
            break
            ;;
        *)
            usage
            ;;
    esac
done

관련 정보