Comando Bash getopts builtin
Em sistemas operacionais do tipo Unix, getopts é um comando interno do shell Bash . Ele analisa opções e argumentos de comando, como os passados para um script de shell.
Descrição
getopts é a versão do bash de outra ferramenta do sistema, getopt . Observe que o comando bash possui um s no final, para diferenciá-lo do comando do sistema.
Enquanto a ferramenta do sistema getopt pode variar de sistema para sistema, o bash getopts é definido pelo padrão POSIX . Portanto, se você escrever um script usando getopts , pode ter certeza de que ele será executado em qualquer sistema executando o bash no modo POSIX (por exemplo, set -o posix ).
getopts analisa opções curtas, que são um único traço (” – “) e uma letra ou dígito. Exemplos de opções curtas são -2 , -d e -D . Também pode analisar opções curtas em combinação, por exemplo, -2dD .
No entanto, getopts não pode analisar opções com nomes longos. Se você quiser opções como –verbose ou –help , use getopt .
Sintaxe
getopts optstring optname [ arg ]
Como funciona
getopts processa os parâmetros posicionais do comando pai. No bash, isso é armazenado na variável de shell ” $@ “. Portanto, se você executar este comando:
mycmd -a argument1 -b argument2
Durante o tempo em que o mycmd estiver em execução, a variável $@ conterá a string ” -a argument1 -b argument2 “. Você pode usar getopts para analisar essa sequência de opções e argumentos.
Toda vez que você executa getopts, ele procura uma das opções definidas no optstring . Se encontrar um, coloca a letra da opção em uma variável chamada optname . Se a opção não corresponder àquelas definidas em optstring , getopts configurará a variável optname como um ponto de interrogação (” ? “).
Se a opção está esperando um argumento, getopts obtém esse argumento e o coloca em $ OPTARG . Se um argumento esperado não for encontrado, a variável optname será configurada como dois pontos (” : “). Getopts então incrementa o índice posicional, $ OPTIND , que indica a próxima opção a ser processada.
A opção especial de dois hífens (” – “) é interpretada por getopts como o final das opções.
O getopts foi projetado para ser executado várias vezes em seu script, em um loop , por exemplo. Ele processa uma opção por iteração de loop. Quando não há mais opções a serem processadas, getopts retorna false, que terminará automaticamente um loop while. Por esse motivo, getopts e while são frequentemente usados juntos.
Especificando a Optstring
optstring é uma string que define quais opções e argumentos as getopts procurarão. Por exemplo, nesta chamada para getopts:
getopts "apZ" optname
As opções esperadas pelos getopts são -a , -p e -Z , sem argumentos. Essas opções podem ser combinadas em qualquer ordem como -aZ , -pa , -Zap , etc.
Digamos que você queira que as opções -a e -Z recebam argumentos. Você pode especificar isso colocando dois pontos (” : “) após essa opção no optstring . Por exemplo:
getopts "a: pZ:" optname
Agora você pode especificar argumentos para as opções -a e -Z , como -a argument1 -pZ argument2 . A opção -p não pode aceitar argumentos, porque não há dois-pontos após op na optstring .
NotaExistem dois caracteres reservados que não podem ser usados como opções: dois pontos (” : “) e o ponto de interrogação (” ? “).
Verificação detalhada de erros
Por padrão, getopts relatará um erro detalhado se encontrar uma opção desconhecida ou um argumento extraviado. Ele também definirá o valor de optname como um ponto de interrogação (” ? “). Ele não atribui um valor a $ OPTARG .
Se a opção for válida, mas um argumento esperado não for encontrado, optname será definido como ” ? “, $ OPTARG será desativado e uma mensagem de erro detalhada será impressa.
Verificação de erro silenciosa
No entanto, se você colocar dois pontos no início da optstring , as getopts serão executadas no “modo silencioso de verificação de erros”. Ele não relatará nenhum erro detalhado sobre opções ou argumentos, e você precisará executar a verificação de erros em seu script.
No modo silencioso, se uma opção for inesperada, getopts definirá optname como ” ? ” E $ OPTARG para o caractere de opção desconhecido.
Se a opção estiver OK, mas um argumento esperado não for encontrado, optname será definido como dois pontos (” : “) e $ OPTARG será definido como o caractere de opção desconhecido.
Especificando Argumentos Customizados
Você geralmente deseja que as getopts processem os argumentos em $@ , mas em alguns casos, convém fornecer manualmente argumentos para que as getopts analisem. Nesse caso, você pode especificar esses argumentos como o argumento final do comando getopts .
Exemplos
Aqui está um script bash usando getopts . O script imprime uma saudação, com um nome opcional, um número variável de vezes. São necessárias duas opções possíveis: -n NAME e -t TIMES .
#! / bin / bash NAME = "" # Nome da pessoa a cumprimentar. TIMES = 1 # Número de cumprimentos a dar. use () {# Função: imprime uma mensagem de ajuda. eco "Uso: $ 0 [-n NOME] [-t VEZES]" 1> & 2 } exit_abnormal () {# Função: sai com erro. uso saída 1 } while getopts ": n: t:" opções; do # Loop: obtenha a próxima opção; # usar verificação de erro silenciosa; # options ne toma argumentos. caso "$ {options}" em # n) # Se a opção for n, NAME = $ {OPTARG} # defina $ NAME para o valor especificado. ;; t) # Se a opção for t, TIMES = $ {OPTARG} # Defina $ TIMES para o valor especificado. re_isanum = '^ [0-9] + $' # Regex: corresponde apenas a números inteiros E se ! [[$ TIMES = ~ $ re_isanum]]; então # se $ TIMES não for um número inteiro: eco "Erro: TIMES deve ser um número inteiro positivo." exit_abnormally saída 1 elif [$ TIMES -eq "0"]; então # Se for zero: echo "Erro: TIMES deve ser maior que zero." exit_abormal # Sair de forma anormal. fi ;; :) # Se o argumento esperado for omitido: echo "Erro: - $ {OPTARG} requer um argumento." exit_abormal # Sair de forma anormal. ;; *) # Se opção desconhecida (qualquer outra): exit_abormal # Sair de forma anormal. ;; esac feito if ["$ NAME" = ""]; # Se $ NAME for uma sequência vazia, STRING = "Olá!" # nossa saudação é apenas "Oi!" else # Caso contrário, STRING = "Olá, $ NAME!" # é "Olá, (nome)!" fi CONTAGEM = 1 # Um contador. while [$ COUNT -le $ TIMES]; do # Enquanto o contador for menor que # ou igual a $ TIMES, echo $ STRING # imprime uma saudação, deixe COUNT + = 1 # e aumente o contador. feito exit 0 # Sair normalmente.
Se esse script for denominado saudação , eis a aparência da saída com diferentes opções:
./cumprimento
Oi!
./greeting -n Dave
Oi Dave!
./greeting -t 3
Oi! Oi! Oi!
./greeting -t 4 -n Betty
Olá Betty! Olá Betty! Olá Betty! Olá Betty!
./greeting -n
Erro: -n requer um argumento. Uso: ./greeting [-n NAME] [-t TIMES]
./greeting -t
Erro: -t requer um argumento. Uso: ./greeting [-n NAME] [-t TIMES]
./greeting -t -1
Erro: TIMES deve ser um número inteiro positivo. Uso: ./greeting [-n NAME] [-t TIMES]
./greeting -t 0
Erro: TIMES deve ser maior que zero. Uso: ./greeting [-n NAME] [-t TIMES]
Comandos relacionados
what – Executa um conjunto de ações enquanto uma determinada condição é verdadeira.