использование getopt
Почему Гетопт?
Чтобы проанализировать разработанные аргументы командной строки, чтобы избежать путаницы и уточнить параметры, которые мы анализируем, чтобы читатель команд мог понять, что происходит.
Что такое getopt?
getopt
используется для разбиения (разбора) параметров в командных строках для упрощения анализа с помощью процедур оболочки и для проверки допустимых параметров. Для этого он использует getopt(3)
подпрограммы GNU .
getopt
может иметь следующие типы опций.
- Варианты без значения
- параметры пары ключ-значение
Примечание. В этом документе при объяснении синтаксиса:
- Все, что находится внутри [], является необязательным параметром в синтаксисе / примерах.
- является заполнителем, что означает, что он должен быть заменен фактическим значением.
КАК ИСПОЛЬЗОВАТЬ getopt
?
Синтаксис: первая форма
getopt optstring parameters
Примеры:
# This is correct
getopt "hv:t::" "-v 123 -t123"
getopt "hv:t::" "-v123 -t123" # -v and 123 doesn't have whitespace
# -h takes no value.
getopt "hv:t::" "-h -v123"
# This is wrong. after -t can't have whitespace.
# Only optional params cannot have whitespace between key and value
getopt "hv:t::" "-v 123 -t 123"
# Multiple arguments that takes value.
getopt "h:v:t::g::" "-h abc -v 123 -t21"
# Multiple arguments without value
# All of these are correct
getopt "hvt" "-htv"
getopt "hvt" "-h -t -v"
getopt "hvt" "-tv -h"
Здесь h, v, t - параметры, а -h -v -t - то, как параметры должны быть заданы в командной строке.
- «h» - это опция без значения.
- 'v:' подразумевает, что опция -v имеет значение и является обязательной. ':' означает, что имеет значение.
- 't ::' подразумевает, что опция -t имеет значение, но является необязательной. «::» означает необязательный.
В необязательном параметре значение не может иметь разделение пробелов с помощью опции. Так, в примере "-t123" -t это опция 123, это значение.
Синтаксис: вторая форма
getopt [getopt_options] [--] [optstring] [parameters]
Здесь после того, как Getopt делится на пять частей
- Сама команда т.е. getopt
- Getopt_options, он описывает, как анализировать аргументы. опции с одним штрихом, варианты с двойным штрихом.
- -, отделяет getopt_options от параметров, которые вы хотите проанализировать, и разрешенных коротких параметров
- Короткие варианты взяты сразу после - найден. Так же, как первый синтаксис формы.
- Параметры, это те параметры, которые вы передали в программу. Параметры, которые вы хотите проанализировать и получить фактические значения, установленные для них.
Примеры
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
Синтаксис: третья форма
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
Здесь после того, как Getopt делится на пять частей
- Сама команда т.е. getopt
- Getopt_options, он описывает, как анализировать аргументы. опции с одним штрихом, варианты с двойным штрихом.
- Короткие опции, т.е. -o или --options. Точно так же, как первый синтаксис формы, но с опцией «-o» и перед «-» (двойная черта).
- -, отделяет getopt_options от параметров, которые вы хотите проанализировать, и разрешенных коротких параметров
- Параметры, это те параметры, которые вы передали в программу. Параметры, которые вы хотите проанализировать и получить фактические значения, установленные для них.
Примеры
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options изменяет способ анализа параметров командной строки.
Ниже приведены некоторые из getopt_options
Опция: -l или --longoptions
Означает, что команда getopt должна позволять распознавать многосимвольные параметры. Несколько параметров разделены запятой.
Например, --name=Karthik
это длинная опция, отправляемая в командной строке. В getopt использование длинных опций похоже на
getopt "name:,version" "--name=Karthik"
Поскольку имя: указано, опция должна содержать значение
Опция: -a или --alternative
Означает, что команда getopt должна позволять длинной опции иметь одну черту '-' вместо двойной тире '-'.
Пример, вместо того, чтобы --name=Karthik
вы могли использовать просто-name=Karthik
getopt "name:,version" "-name=Karthik"
Полный пример скрипта с кодом:
#!/bin/bash
# filename: commandLine.sh
# author: @theBuzzyCoder
showHelp() {
# `cat << EOF` This means that cat should stop reading when EOF is detected
cat << EOF
Usage: ./installer -v <espo-version> [-hrV]
Install Pre-requisites for EspoCRM with docker in Development mode
-h, -help, --help Display help
-v, -espo-version, --espo-version Set and Download specific version of EspoCRM
-r, -rebuild, --rebuild Rebuild php vendor directory using composer and compiled css using grunt
-V, -verbose, --verbose Run script in verbose mode. Will print out each step of execution.
EOF
# EOF is found above and hence cat command stops reading. This is equivalent to echo but much neater when printing out.
}
export version=0
export verbose=0
export rebuilt=0
# $@ is all command line parameters passed to the script.
# -o is for short options like -v
# -l is for long options with double dash like --version
# the comma separates different long options
# -a is for long options with single dash like -version
options=$(getopt -l "help,version:,verbose,rebuild,dryrun" -o "hv:Vrd" -a -- "$@")
# set --:
# If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters
# are set to the arguments, even if some of them begin with a ‘-’.
eval set -- "$options"
while true
do
case $1 in
-h|--help)
showHelp
exit 0
;;
-v|--version)
shift
export version=$1
;;
-V|--verbose)
export verbose=1
set -xv # Set xtrace and verbose mode.
;;
-r|--rebuild)
export rebuild=1
;;
--)
shift
break;;
esac
shift
done
Запуск этого файла сценария:
# With short options grouped together and long option
# With double dash '--version'
bash commandLine.sh --version=1.0 -rV
# With short options grouped together and long option
# With single dash '-version'
bash commandLine.sh -version=1.0 -rV
# OR with short option that takes value, value separated by whitespace
# by key
bash commandLine.sh -v 1.0 -rV
# OR with short option that takes value, value without whitespace
# separation from key.
bash commandLine.sh -v1.0 -rV
# OR Separating individual short options
bash commandLine.sh -v1.0 -r -V
-s
, сделать его позиционное аргумент:./myscript 45 anystring
.