Використовуйте getopt
Чому 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 або --logoptions
Команда getopt має надати можливість розпізнавати багато символи. Кілька варіантів розділені комою.
Наприклад, --name=Karthik
довгий варіант, що надсилається в командному рядку. У методі getopt подібне використання довгих варіантів
getopt "name:,version" "--name=Karthik"
Оскільки вказано ім'я: опція повинна містити значення
Варіант: -a або - альтернативний
Команда 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
.