쉘 스크립트에 도움말 메소드를 추가하려면 어떻게해야합니까?


답변:


173

bash의 예는 다음과 같습니다.

usage="$(basename "$0") [-h] [-s n] -- program to calculate the answer to life, the universe and everything

where:
    -h  show this help text
    -s  set the seed value (default: 42)"

seed=42
while getopts ':hs:' option; do
  case "$option" in
    h) echo "$usage"
       exit
       ;;
    s) seed=$OPTARG
       ;;
    :) printf "missing argument for -%s\n" "$OPTARG" >&2
       echo "$usage" >&2
       exit 1
       ;;
   \?) printf "illegal option: -%s\n" "$OPTARG" >&2
       echo "$usage" >&2
       exit 1
       ;;
  esac
done
shift $((OPTIND - 1))

함수 안에서 이것을 사용하려면 :

  • "$FUNCNAME"대신에 사용$(basename "$0")
  • local OPTIND OPTARG전화하기 전에 추가getopts

1
함수 내에서 이것을 시도하고 있지만 함수를 실행하려고하면 "basename : invalid option- 'b'"오류가 발생합니다. basename선행 대시와 함께 "-bash"를 전달하려는 것 같습니다 .
Morgan Estes

5
기능 사용을 imside "$FUNCNAME"없습니다 "$0". 또한, 추가local OPTIND OPTARG
글렌 잭맨

감사. FUNCNAME공장. 하나의 파일에 모든 기능이 있으므로 다른 사람에게 유용한 기능으로 확장하는 데 적합합니다.
Morgan Estes

5
@sigur, 사용하는 "$usage" 모든 장소를 인용 하십시오.
glenn jackman 2016

1
무엇입니까 shift $((OPTIND - 1))?
hpaknia

45

쉘 스크립트에 대한 첫 번째 인수는 변수로 사용할 수 $1있으므로 가장 간단한 구현은 다음과 같습니다.

if [ "$1" == "-h" ]; then
  echo "Usage: `basename $0` [somestuff]"
  exit 0
fi

그러나 아누 바바가 말한 것.


감사합니다 @MarkBooth, 오타 수정 (따옴표로 묶음으로 개선)
seb


2
OP는 bash를 지정하지 않았지만 [POSIX 호환 버전입니다.
seb

주 - 내부 사용을 위해 function: 당신은 교체해야합니다 exit 0으로 return당신이 당신의 기능을 실행 한 후 쉘을 종료하지 않으려면. (나는 전에 그것을 😂)
일루미네이터

29

여기 내가 VNC 서버를 시작하는 데 사용하는 부분입니다

#!/bin/bash
start() {
echo "Starting vnc server with $resolution on Display $display"
#your execute command here mine is below
#vncserver :$display -geometry $resolution
}

stop() {
echo "Killing vncserver on display $display"
#vncserver -kill :$display
}

#########################
# The command line help #
#########################
display_help() {
    echo "Usage: $0 [option...] {start|stop|restart}" >&2
    echo
    echo "   -r, --resolution           run with the given resolution WxH"
    echo "   -d, --display              Set on which display to host on "
    echo
    # echo some stuff here for the -a or --add-options 
    exit 1
}

################################
# Check if parameters options  #
# are given on the commandline #
################################
while :
do
    case "$1" in
      -r | --resolution)
          if [ $# -ne 0 ]; then
            resolution="$2"   # You may want to check validity of $2
          fi
          shift 2
          ;;
      -h | --help)
          display_help  # Call your function
          exit 0
          ;;
      -d | --display)
          display="$2"
           shift 2
           ;;

      -a | --add-options)
          # do something here call function
          # and write it in your help function display_help()
           shift 2
           ;;

      --) # End of all options
          shift
          break
          ;;
      -*)
          echo "Error: Unknown option: $1" >&2
          ## or call function display_help
          exit 1 
          ;;
      *)  # No more options
          break
          ;;
    esac
done

###################### 
# Check if parameter #
# is set too execute #
######################
case "$1" in
  start)
    start # calling function start()
    ;;
  stop)
    stop # calling function stop()
    ;;
  restart)
    stop  # calling function stop()
    start # calling function start()
    ;;
  *)
#    echo "Usage: $0 {start|stop|restart}" >&2
     display_help

     exit 1
     ;;
esac

별도의 경우에 시작 중지 다시 시작을 배치 한 것이 조금 이상하지만 작동해야합니다.


-d에 빈 옵션을 제공하면; 무한 루프되지 않습니까?
zerobane

헬퍼 함수에서 1을 종료하는 이유는 무엇입니까?
jeantimex

17

빠른 단일 옵션 솔루션을 사용하려면 if

확인할 단일 옵션 만 있고 항상 첫 번째 옵션 ( $1) 인 경우 가장 간단한 해결책은 if테스트 ( [)입니다. 예를 들면 다음과 같습니다.

if [ "$1" == "-h" ] ; then
    echo "Usage: `basename $0` [-h]"
    exit 0
fi

posix 호환성 =은 다음과 같이 작동 ==합니다.

왜 인용 $1?

$1따옴표로 묶어야 하는 이유는 $1셸 이 없으면 쉘이 실행을 시도 if [ == "-h" ]하고 실패 하려고하기 때문입니다 ==.

$ [ == "-h" ]
bash: [: ==: unary operator expected

더 복잡한 용도 getopt또는getopts

으로 제안 하여 다른 인수를 받아들이는 당신의 옵션을 하나의 간단한 옵션보다 더 많은, 또는 필요한 경우, 당신은 확실히 사용하는 여분의 복잡성 가야한다 getopts.

빠른 참조로 60 초 getopts tutorial을 좋아 합니다.

getopt내장 쉘 대신 프로그램 을 고려할 수도 있습니다 getopts. 긴 옵션과 옵션 아닌 인수 뒤에 옵션을 사용할 수 있습니다 (예 : foo a b c --verbose그냥 foo -v a b c). 이 Stackoverflow 답변 은 GNU 사용법을 설명합니다 getopt.

jeffbyrnes원본 링크가 죽었지 만 고맙게도 기계 가 그것을 보관 하는 방식에 대해 언급 했습니다.


감사! 나는 getopts를 1 년 동안 행복하게 사용하고 있지만 getopt도 살펴볼 것이다.
tttppp

1
안타깝게도 60 초 getopts 튜토리얼 링크는 죽었습니다. bashcurescancer.com은 더 이상없는 것 같습니다. 다음은 Wayback Machine 버전에 대한 링크 입니다.
jeffbyrnes 2014 년


-1

나는 당신이 이것을 사용할 수 있다고 생각합니다 ...

case $1 in 
 -h) echo $usage ;; 
  h) echo $usage ;;
help) echo $usage ;;
esac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.