Usar getopt
Por que obter?
Analisar argumentos de linha de comando elaborados para evitar confusão e esclarecer as opções que estamos analisando para que o leitor dos comandos possa entender o que está acontecendo.
O que é getopt?
getopt
é usado para dividir (analisar) opções nas linhas de comando para facilitar a análise por procedimentos de shell e verificar opções legais. Ele usa as getopt(3)
rotinas GNU para fazer isso.
getopt
pode ter os seguintes tipos de opções.
- Opções sem valor
- opções de par de valores-chave
Nota: Neste documento, durante a explicação da sintaxe:
- Qualquer coisa dentro de [] é um parâmetro opcional na sintaxe / exemplos.
- é um espaço reservado, o que significa que deve ser substituído por um valor real.
COMO USAR getopt
?
Sintaxe: Primeira Forma
getopt optstring parameters
Exemplos:
# 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"
Aqui h, v, t são as opções e -h -v -t é como as opções devem ser dadas na linha de comando.
- 'h' é uma opção sem valor.
- 'v:' implica que a opção -v possui valor e é uma opção obrigatória. ':' significa que tem um valor.
- 't ::' implica que a opção -t possui valor, mas é opcional. '::' significa opcional.
No parâmetro opcional, o valor não pode ter espaço em branco com a opção Portanto, no exemplo "-t123", -t é a opção 123 é o valor.
Sintaxe: Segunda Forma
getopt [getopt_options] [--] [optstring] [parameters]
Aqui, depois que o getopt é dividido em cinco partes
- O comando em si, ou seja, getopt
- O getopt_options, descreve como analisar os argumentos. opções longas de traço único, opções de traço duplo.
- -, separa as getopt_options das opções que você deseja analisar e as opções curtas permitidas
- As opções curtas, são tomadas imediatamente após - é encontrado. Assim como a primeira sintaxe do formulário.
- Os parâmetros, essas são as opções que você passou para o programa. As opções que você deseja analisar e obter os valores reais definidos nelas.
Exemplos
getopt -l "name:,version::,verbose" -- "n:v::V" "--name=Karthik -version=5.2 -verbose"
Sintaxe: Terceira Forma
getopt [getopt_options] [-o options] [--] [optstring] [parameters]
Aqui, depois que o getopt é dividido em cinco partes
- O comando em si, ou seja, getopt
- O getopt_options, descreve como analisar os argumentos. opções longas de traço único, opções de traço duplo.
- As opções curtas ou seja, -o ou --opções. Assim como a primeira sintaxe do formulário, mas com a opção "-o" e antes do "-" (traço duplo).
- -, separa as getopt_options das opções que você deseja analisar e as opções curtas permitidas
- Os parâmetros, essas são as opções que você passou para o programa. As opções que você deseja analisar e obter os valores reais definidos nelas.
Exemplos
getopt -l "name:,version::,verbose" -a -o "n:v::V" -- "-name=Karthik -version=5.2 -verbose"
GETOPT_OPTIONS
getopt_options altera a maneira como os parâmetros de linha de comando são analisados.
Abaixo estão algumas das getopt_options
Opção: -l ou --longoptions
Significa que o comando getopt deve permitir que opções com vários caracteres sejam reconhecidas. Várias opções são separadas por vírgula.
Por exemplo, --name=Karthik
é uma opção longa enviada na linha de comando. Em getopt, o uso de opções longas é como
getopt "name:,version" "--name=Karthik"
Como name: é especificado, a opção deve conter um valor
Opção: -a ou --alternative
Significa que o comando getopt deve permitir que a opção longa tenha um único traço '-' em vez de traço duplo '-'.
Exemplo, em vez de --name=Karthik
você poderia usar apenas-name=Karthik
getopt "name:,version" "-name=Karthik"
Um exemplo completo de script com o código:
#!/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
Executando este arquivo de script:
# 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
, torná-lo um argumento posicional:./myscript 45 anystring
.