Posługiwać się getopt
Dlaczego getopt?
Aby przeanalizować złożone argumenty wiersza polecenia, aby uniknąć zamieszania i wyjaśnić opcje, które analizujemy, aby czytelnik poleceń mógł zrozumieć, co się dzieje.
Co to jest getopt?
getopt
służy do dzielenia (parsowania) opcji w wierszach poleceń w celu łatwego parsowania według procedur powłoki oraz do sprawdzania legalnych opcji. Korzysta z GNUgetopt(3)
procedury .
getopt
może mieć następujące typy opcji.
- Opcje bez wartości
- opcje pary klucz-wartość
Uwaga: W tym dokumencie podczas wyjaśniania składni:
- Wszystko wewnątrz [] jest opcjonalnym parametrem w składni / przykładach.
- to symbol zastępczy, co oznacza, że należy go zastąpić rzeczywistą wartością.
JAK KORZYSTAĆ getopt
?
Składnia: pierwsza forma
getopt optstring parameters
Przykłady:
# 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"
Tutaj h, v, t to opcje, a -h -v -t to sposób, w jaki opcje powinny być podawane w wierszu poleceń.
- „h” jest opcją bez wartości.
- „v:” oznacza, że opcja -v ma wartość i jest opcją obowiązkową. „:” oznacza ma wartość.
- „t ::” oznacza, że opcja -t ma wartość, ale jest opcjonalna. „::” oznacza opcjonalne.
W opcjonalnym parametrze wartość nie może mieć separacji białych znaków z opcją. Zatem w przykładzie „-t123” -t to opcja 123 to wartość.
Składnia: druga forma
getopt [getopt_options] [--] [optstring] [parameters]
Tutaj po getopt podzielony jest na pięć części
- Samo polecenie, tj. Getopt
- W getopt_options opisano, jak parsować argumenty. pojedyncze długie kreski, opcje podwójne kreski.
- -, oddziela getopt_options od opcji, które chcesz przeanalizować i dozwolonych krótkich opcji
- Krótkie opcje są brane natychmiast po znalezieniu. Podobnie jak pierwsza składnia Form.
- Parametry to opcje przekazane do programu. Opcje, które chcesz przeanalizować i uzyskać ustawione na nich rzeczywiste wartości.
Przykłady
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
Składnia: trzecia forma
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
Tutaj po getopt podzielony jest na pięć części
- Samo polecenie, tj. Getopt
- W getopt_options opisano, jak parsować argumenty. pojedyncze długie kreski, opcje podwójne kreski.
- Krótkie opcje tj. -O lub --opcje. Podobnie jak pierwsza składnia Form, ale z opcją „-o” i przed „-” (podwójny myślnik).
- -, oddziela getopt_options od opcji, które chcesz przeanalizować i dozwolonych krótkich opcji
- Parametry to opcje przekazane do programu. Opcje, które chcesz przeanalizować i uzyskać ustawione na nich rzeczywiste wartości.
Przykłady
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options zmienia sposób, w jaki analizowane są parametry wiersza poleceń.
Poniżej znajdują się niektóre z opcji getopt_options
Opcja: -l lub --długie opcje
Oznacza, że polecenie getopt powinno umożliwiać rozpoznanie opcji wieloznakowych. Wiele opcji oddzielonych jest przecinkiem.
Na przykład --name=Karthik
jest długą opcją wysyłaną w wierszu polecenia. W getopt użycie długich opcji jest podobne
getopt "name:,version" "--name=Karthik"
Ponieważ nazwa: jest określona, opcja powinna zawierać wartość
Opcja: -a lub - alternatywna
Oznacza, że polecenie getopt powinno pozwolić na długą opcję posiadania pojedynczego myślnika „-” zamiast podwójnego myślnika „-”.
Przykład, zamiast --name=Karthik
możesz użyć po prostu-name=Karthik
getopt "name:,version" "-name=Karthik"
Kompletny przykład skryptu z kodem:
#!/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
Uruchamianie tego pliku skryptu:
# 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
sprawiają, że pozycyjną argumentu./myscript 45 anystring
.