명령 옵션을 읽기 위해 'case $1 in'을 사용합니다. 대시 뒤에 여러 플래그가 있고 특이한 플래그를 처리합니까?

명령 옵션을 읽기 위해 'case $1 in'을 사용합니다. 대시 뒤에 여러 플래그가 있고 특이한 플래그를 처리합니까?

긴 옵션과 짧은 플래그를 모두 사용하는 bash 스크립트를 만들고 있습니다. 긴 옵션을 원하기 때문에 getopts. 다음 코드를 사용해 보았습니다.

while test -n "$1"; do
  case "$1" in
        -o|--override)  NO_CHANGE=yes;shift 1;;
        -r|--reset)     OV_RESET=yes;shift 1;;
        -h|--help)      hthemehelp;shift 1;;
        *)              break;;
  esac
done

이것은 myscr -o -ror 처럼 호출할 때 작동 myscr -h하지만 myscr -or프로그램을 실행하려고 하면 정상적인 동작이고 실행하면 myscr -or -h에 도달하기 전에 루프가 종료됩니다 -h. 정당한 원인 break으로 교체 하고 정지합니다.continuemyscr -ormyscr -or -h

답변1

사이즈에 맞게 입어보세요:

#!/bin/bash
pleasereset=1
while test -n "$1"; do
   pleaseshift=0
   [[ pleasereset -eq 1 ]] && thisvar=$1 && pleasereset=0;
   case "$thisvar" in
      -o*|--override) echo "override!"; pleaseshift=1;;
      -r*|--reset) echo "reset!"; pleaseshift=1;;
      -h*|--help) echo "help!"; pleaseshift=1;;
      *) break ;;
   esac
   if [[ "$pleaseshift" = "1" ]];
   then
      testvar=${thisvar##-}
      if [[ ${#testvar} -gt 1 ]] && [[ ! ${thisvar} = --* ]];
      then
         thisvar=-$( echo "$testvar" | cut -c 2- )
      else
         shift 1; pleasereset=1;
      fi
   fi
done

특정 사례와 일치하지 않는 첫 번째 매개변수에서 매개변수 구문 분석이 중지되므로 ./foobar.sh -o --help -s -r에서 를 처리하지 않습니다 -r. 이는 *) break;;오류 처리로 줄을 변경하여 조정할 수 있지만 pleaseshift=1!

답변2

어쩌면 원하는 줄을 추가하는 것으로 충분할 수도 있습니다.

while test -n "$1"; do
  case "$1" in
        -or|-ro)        OV_RESET=yes;NO_CHANGE=yes;shift 1;;
        -o|--override)  NO_CHANGE=yes;shift 1;;
        -r|--reset)     OV_RESET=yes;shift 1;;
        -h|--help)      hthemehelp;shift 1;;
        *)              break;;
  esac
done

또는 더 복잡한 경우에는 해당 블록 외부에 있지만 여전히 while 내부에 있는 case함수에 블록을 넣을 수 있습니다. 에 대한shift 1
두 배로options ( -or, -oh, 긴 옵션 중 하나가 아닌 경우 각 문자에 대해 동일한 함수를 반복적으로 호출할 수 있습니다 case *)... 방금 긴 옵션으로 처리한 경우 플래그가 필요합니다 $1. 그러나 이 경우 스크립트 tp를 노출합니다. 인쇄 오류로 인한 잘못된 동작(예: -overrider I will process-o -v -e -r -d`...라고 쓰는 경우 )

관련 정보