Как добавить метод справки в оболочку script?

Как проверить, был ли атрибут -h передан в оболочку script? Я хотел бы отобразить справочное сообщение, когда пользователь вызывает myscript.sh -h.

Ответ 1

вот пример для 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

Ответ 2

Первый аргумент оболочки script доступен как переменная $1, поэтому самой простой реализацией будет

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

Но что сказал анубхава.

Ответ 3

вот часть, которую я использую для запуска сервера 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
;;

Немного странно, что я поставил перезапуск старта в отдельном случае, но он должен работать

Ответ 4

Если у вас есть только одна опция для проверки, и она всегда будет первой опцией ($1), то самым простым вариантом будет if с тестом ([). Например:

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

Обратите внимание, что для совместимости posix = будет работать, а также ==.

Причина, по которой $1 должна быть заключена в кавычки, заключается в том, что если нет $1, тогда оболочка попытается запустить if [ == "-h" ] и завершится сбой, потому что == предоставлен только один аргумент, когда он был ожидая двух:

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

Как предложил , , если у вас есть более чем один простой параметр или вам нужны ваши аргументы, то вам обязательно нужно усложнить использование getopts. В качестве краткой справки мне нравится 60-й учебник getopts. & dagger;

Вы также можете рассмотреть getopt вместо встроенной оболочки getopts. Он позволяет использовать длинные параметры и опции после аргументов без опции (например, foo a b c -v, а не только foo -v a b c). fooobar.com/questions/19669/... объясняет, как использовать GNU getopt.

& крестик; jeffbyrnes упоминал, что исходная ссылка умерла, но, к счастью, машина обратного пути заархивировала ее.

Ответ 6

Я думаю, вы можете использовать для этого случай...

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

Ответ 7

Я просто загружаю файл онлайн-руководства и извлекаю его с помощью curl. Например, ниже код извлекается из Github.

    #######################################
    # Show help
    #
    # Globals:
    #   None
    # Arguments:
    #   None
    # Returns:
    #   None
    #
    #######################################
    show_help () {
        curl https://raw.githubusercontent.com/KENJU/shellscript_todo/master/MANUAL | less
    }