"?",그리고 *

"?",그리고 *

스택오버플로우 게시물명령줄 인수를 처리하기 위한 템플릿이 있습니다.

이 테스트는 [ $# == 0 ]bash 스크립트가 매개변수 없이 실행되어서는 안 된다는 것을 의미합니까? 템플릿이기 때문에 일반적으로 스크립트에 매개 변수가 반드시 필요하지는 않다고 생각합니다.

case성명서 에서 이 두 상황의 차이점은 무엇입니까 *)? "?")그들은 똑같아 보인다.

# --- Options processing -------------------------------------------
if [ $# == 0 ] ; then
    echo $USAGE
    exit 1;
fi

while getopts ":i:vh" optname
  do
    case "$optname" in
      "v")
        echo "Version $VERSION"
        exit 0;
        ;;
      "i")
        echo "-i argument: $OPTARG"
        ;;
      "h")
        echo $USAGE
        exit 0;
        ;;
      "?")
        echo "Unknown option $OPTARG"
        exit 0;
        ;;
      ":")
        echo "No argument value for option $OPTARG"
        exit 0;
        ;;
      *)
        echo "Unknown error while processing options"
        exit 0;
        ;;
    esac
  done

shift $(($OPTIND - 1))

param1=$1
param2=$2

답변1

스크립트에는 하나 이상의 매개변수가 필요하며, 매개변수가 없으면 사용법 정보를 표시합니다. echo $USAGE >&2버그이기 때문에 이렇게 해야 합니다 . 다른 스크립트에서는 매개변수가 0개일 수 있으므로 수정해야 합니다. 일부 사람들이 이 주장을 받아들이지 않는 것처럼요 i.

"?",그리고 *

예, 다릅니다.

  • "?"그는 하나를 찾고 있다고 말했다 ?. 이것은 예상치 못한 옵션(잘못된 옵션)을 발견했을 때 getopts가 반환하는 것입니다.
  • *일치하는 다른 항목을 찾을 수 없으면 케이스에 이렇게 하세요. 이런 일은 일어나서는 안 되지만 일어날 수 있습니다. getopts의 버그이거나 프로그램의 버그일 가능성이 높습니다(방어 프로그래밍 참조).

답변2

그것들은 동일해야 합니다.

그러나 이 코드에는 다음과 같은 문제가 있습니다.

  • 산술 확장을 참조하지 못했습니다.shift "$(($OPTIND - 1))"
  • ==비이동형 연산자 사용
  • 표준 출력에 오류 메시지 쓰기
  • 오류가 발생하면 상태 0(성공)으로 종료됩니다.
  • 변수를 참조하지 못했습니다 "$#".echo "$USAGE"
  • 인수가 없는 경우 검사가 제대로 이루어지지 않았습니다.뒤쪽에속지 않도록 getopts 루프를 실행합니다.script --
  • 쓸데없는 참고자료 v, h그리고i:i:vh

관련 정보