getopts의 예기치 않은 동작

getopts의 예기치 않은 동작

고려하면:

#!/bin/sh

while getopts ":h" o; do
  case "$o" in
    h )
    "Usage:
    sh $(basename "$0") -h      Displays help message
    sh $(basename "$0") arg     Outputs ...

     where:
    -h   help option
        arg  argument."
    exit 0
    ;;
    \? )
    echo "Invalid option -$OPTARG" 1>&2
    exit 1
    ;;
    : )
    echo "Invalid option -$OPTARG requires argument" 1>&2
    exit 1
    ;;
  esac
done

이 호출은 무엇을 반환 합니까 not found?

$ sh getopts.sh -h
getopts.sh: 12: getopts.sh: Usage:
    sh getopts.sh -h        Displays help message
    sh getopts.sh arg   Outputs ...

     where:
    -h   help option
        arg  argument.: not found

좋아요:

$ sh getopts.sh arg

이를 위해 "잘못된 옵션"이 필요합니다.

$ sh getopts.sh

좋아요:

$ sh getopts.sh -s x
Invalid option -s

답변1

메시지 인쇄를 놓치고 대신 실행할 명령으로 전체 문자열을 전달한 것 같습니다. echo문자열 앞에 a를 추가하세요.

case "$o" in
  h )
  echo "Usage:
  sh $(basename "$0") -h      Displays help message
  sh $(basename "$0") arg     Outputs ...

   where:
  -h   help option
      arg  argument."
  exit 0
  ;;

그러나 일반적으로 여러 줄 문자열을 인쇄하려면 구분 기호를 추가하는 것이 좋습니다.

show_help() {
cat <<'EOF'
Usage:
    sh $(basename "$0") -h      Displays help message
    sh $(basename "$0") arg     Outputs ...

     where:
    -h   help option
        arg  argument.
EOF
}

show_help플래그 에 해당 기능을 사용하십시오 -h.

또한 빈 인수 플래그를 사용하면 첫 번째 호출이 getopts()루프를 종료하므로 루프 내부에 핸들이 있을 수 없습니다. 호출하기 전에 빈 매개변수에 대한 일반 확인getopts()

if [ "$#" -eq 0 ]; then
    printf 'no argument flags provided\n' >&2
    exit 1
fi

매개변수 flag 의 이전 정의에 따르면 :h이는 -h허용되는 매개변수가 없음을 나타냅니다. 이 절은 :)매개변수를 취하도록 정의한 경우, 즉 로 정의된 경우에만 적용됩니다. 그래야만 인수를 전달하지 않고 실행할 수 있으며 아래 코드가 실행됩니다. 전체 스크립트를 하나로 합치기-h:h::)

#!/usr/bin/env bash

if [ "$#" -eq 0 ]; then
    printf 'no argument flags provided\n' >&2
    exit 1
fi

show_help() {
cat <<'EOF'
Usage:
    sh $(basename "$0") -h      Displays help message
    sh $(basename "$0") arg     Outputs ...

     where:
    -h   help option
        arg  argument.
EOF
}

while getopts ":h:" opt; do
  case "$opt" in
    h )
    show_help
    exit 1
    ;;
    \? )
    echo "Invalid option -$OPTARG" 1>&2
    exit 1
    ;;
    : )
    echo "Invalid option -$OPTARG requires argument" 1>&2
    exit 1
    ;;
  esac
done

지금 실행해

$ bash script.sh 
no argument flags provided
$ bash script.sh -h
Invalid option -h requires argument
$ bash script.sh -s
Invalid option -s

관련 정보