한 줄에 여러 매개변수가 있는 Bash 메뉴

한 줄에 여러 매개변수가 있는 Bash 메뉴

며칠 동안 검색했지만 여전히 답을 찾지 못했습니다. 당신이 나에게 올바른 방향을 알려줄 수 있기를 바랍니다.

한 줄로 호출할 수 있는 옵션이 포함된 bash 스크립트를 작성하는 방법을 알고 싶습니다. 예: script.sh -a -b -c. 선택하지 않은 매개변수는 무시됩니다.

메뉴/옵션은 다음과 같아야 합니다.

-a description: something
-b description: something else
-c description: something different
-d description: something..

이를 수행할 수 있는 방법이 있습니까?

답변1

스위치와 매개변수를 처리하는 일반적인 방법은 getopts함수를 사용하는 것입니다. 이는 내장 함수이며 bashbash 매뉴얼 페이지( ) man bash에서 이에 대한 정보를 찾을 수 있습니다.

getopts기본적으로 어떤 매개변수가 필요한지, 매개변수가 있어야 하는지 여부를 알려주는 문자열을 선언합니다 . getopts수많은 인수(예: -abc등가물 -a -b -c)와 명령줄 구문 분석을 처리 합니다 . 처리가 끝나면 getopts나머지 명령줄을 원하는 대로 처리할 수 있습니다.

일반적인 스크립트 조각은 다음과 같습니다.

ARG_A= FLAG_B= FLAG_C=
while getopts 'a:bc' OPT    # -a {argument}, -b, -c
do
    case "$OPT" in
        a)    ARG_A="$OPTARG" ;;
        b)    FLAG_B=yes ;;
        c)    FLAG_C=yes ;;
        *)    echo "ERROR: the options are -a {arg}, -b, -c" >&2; exit 1 ;;
    esac
done
shift $(($OPTIND - 1))

echo "Remaining command line: $*"

?원하는 경우 명령 옵션으로 추가할 수 있습니다.좋아요메시지를 사용하세요. 블록 내에서 case이를 인용하거나 앞에 백슬래시를 넣어야 리터럴로 처리된다는 점을 기억하십시오.

내장된 명령 없이 다른 쉘에서 실행하고 싶거나,긴 논쟁예를 들어 유틸리티 만 보는 --verbose것이 아닙니다 . 이는 내장되어 있지 않지만 보다 복잡한 상황에서 제공되도록 작성되었습니다.-vgetopt

답변2

이 작업을 수행하기 위해 Bash 관련 기능을 사용할 필요는 없습니다.

#!/bin/sh
while true
do
    case "$1" in
        -a)  echo Saw -a!  ;;
        -b)  echo Saw -b!  ;;
        -c)  echo Saw -c!  ;;
        -?)  cat <<USAGE
usage: $0 [-a] [-b] [-c] args

    You cannot currently combine options, as with -ac.
USAGE
            exit 1
            ;;
        *)
            echo End of options!
            break;
            ;;
    esac

    shift       # toss current $1; we're done with it now
done

for p in "$@"
do
    echo "Non-option argument: '$p'"
done

의 코드와 다릅니다.엠마 루오의 답변, 내 것은 이식 가능한 쉘 스크립트 코드입니다. Bourne 유형의 Unix 쉘에서 실행되며 1980년경으로 거슬러 올라갑니다.

-?나는 핸들러가 귀하의 "메뉴" 요구 사항을 충족한다고 생각합니다 . 이 <<USAGE구조는트레독.

관련 정보