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

-h속성이 쉘 스크립트로 전달 되었는지 어떻게 확인 합니까? 사용자가 전화를 걸 때 도움말 메시지를 표시하고 싶습니다 myscript.sh -h.



답변

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있으므로 가장 간단한 구현은 다음과 같습니다.

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

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


답변

여기 내가 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

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


답변

빠른 단일 옵션 솔루션을 사용하려면 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원본 링크가 죽었지 만 고맙게도 기계 가 그것을 보관 하는 방식에 대해 언급 했습니다.


답변

bash의 getopt 기능을 사용하는 것이 좋습니다. 자세한 도움말은이 Q & A를 참조하십시오. bash 쉘 스크립트에서 getopts를 사용하여 길고 짧은 명령 행 옵션 가져 오기


답변

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

case $1 in
 -h) echo $usage ;;
  h) echo $usage ;;
help) echo $usage ;;
esac


답변