fbpx

Comandos Linux – Comando getopts

Comando Bash getopts builtin

Atualizado: 05/04/2019 por Computer Hope

comando getopts

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]

what – Executa um conjunto de ações enquanto uma determinada condição é verdadeira.

19 de novembro de 2019

Sobre nós

A Linux Force Brasil é uma empresa que ama a arte de ensinar. Nossa missão é criar talentos para a área de tecnologia e atender com excelência nossos clientes.

CNPJ: 13.299.207/0001-50
SAC:         0800 721 7901

[email protected]

Comercial  Comercial: (11) 3796-5900

Suporte:    (11) 3796-5900
[email protected]

Copyright © Linux Force Security  - Desde 2011.