Как добавить метод справки в сценарий оболочки? - PullRequest
109 голосов
/ 29 марта 2011

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

Ответы [ 7 ]

144 голосов
/ 29 марта 2011

вот пример для 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
40 голосов
/ 29 марта 2011

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

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

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

22 голосов
/ 14 июня 2015

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

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

14 голосов
/ 01 марта 2013

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

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

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

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

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

Как подсказал by others , если у вас есть более одной простой опции или вам нужны опции для принятия аргументов, то вам определенно стоит пойти на дополнительную сложность использования getopts.В качестве краткого справочного материала мне нравится 60-секундный учебник getopts .

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

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

5 голосов
/ 29 марта 2011

Лучше использовать getopt средство bash. Пожалуйста, посмотрите на эти вопросы и ответы для получения дополнительной помощи: Использование getopts в скрипте оболочки bash для получения длинных и коротких опций командной строки

0 голосов
/ 19 октября 2015

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

    #######################################
    # Show help
    #
    # Globals:
    #   None
    # Arguments:
    #   None
    # Returns:
    #   None
    #
    #######################################
    show_help () {
        curl https://raw.githubusercontent.com/KENJU/shellscript_todo/master/MANUAL | less
    }
0 голосов
/ 08 августа 2014

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

case $1 in 
 -h) echo $usage ;; 
  h) echo $usage ;;
help) echo $usage ;;
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...