여러 getopts 인수 사용을 거부합니다.

여러 getopts 인수 사용을 거부합니다.

상황에서 여러 getopts 인수를 거부하는 방법을 찾으려고 노력 중입니다. 다음과 같은 것이 있다고 가정해 보겠습니다.

while getopts "a:b:c:def" variable; do
case $variable in
a)a=$OPTARG
b)b=$OPTARG
c)c=$OPTARG
d)MODE=SMTH
e)MODE=SMTH2
f)MODE=SMTH3
esac
done

내가 원하는 것은 여러 MODE arg(def)의 사용을 거부하고 사용자에게 이를 알리는 메시지를 표시하는 것입니다. 다음과 같은 것 :

./script.sh -a ajhsd -b kjdhas -c daskjdha -d -e -f

여러 MODE arg(def)가 사용되었는지 확인하기 위해 검사를 수행합니다. 둘 이상을 사용하면 오류 메시지가 표시됩니다. if 문을 확인하는 간단한 입력을 사용해 보았지만 비참하게 실패했습니다. 항상 세 가지 인수를 모두 반복하고 여러 인수 검사를 거치지 않고도 마지막으로 전달된 인수를 가져옵니다. 조금 이상합니다. 이 작업은 쉬워야 합니다. 그랬어야 했는데...

답변1

MODE, 및 이외의 값 으로 초기화해야 합니다 . 그런 다음 MODE가 초기값인지 확인합니다. 그렇지 않은 경우 오류 메시지를 표시하고 종료합니다. 오류가 발생한 후에는 종료해야 합니다. 그렇지 않으면 스크립트가 계속 실행됩니다. 아래 스크립트의 수정된 버전을 사용하면 시작할 수 있습니다.SMTHSMTH2SMTH3

MODE=0
EMSG="More than one of -d, -e, -f has been specified"
while getopts "a:b:c:def" variable; do
case $variable in
a) a=$OPTARG ;;
b) b=$OPTARG ;;
c) c=$OPTARG ;;
d) if [ $MODE = 0 ] ; then MODE=SMTH  ; else  echo $EMSG  ; exit 1 ; fi ;;
e) if [ $MODE = 0 ] ; then MODE=SMTH2 ; else  echo $EMSG  ; exit 1 ; fi ;;
f) if [ $MODE = 0 ] ; then MODE=SMTH3 ; else  echo $EMSG  ; exit 1 ; fi ;;
esac
done

관련 정보