getopts
Este comando serve para permitir que você use parâmetros na linha de
comando de maneira mais eficiente que ficar usando as variáveis de posição
de parâmetros ($1
, $2
...).
Sua sintaxe é:
getopts 'CadeiaDeOpcoes' variavel
Onde CadeiaDeOpcoes
consiste em cada caractere que o getopts
considerará, e variavel
receberá este caractere. Para passar um
parâmetro para o script você usa -c
onde c
é o parâmetro. Veja este
exemplo hipotético:
getopts 'ab:c' variavel
Você poderá usar os parâmetros a
, b
ou c
. Note que b
é seguido
de um :
, isso significa que b
é um parâmetro que precisa de
argumento. Este, por sua vez, é armazenado na variável OPTARG
.
Mais detalhadamente, o getopts funciona assim:
Examina todos os argumentos da linha de comando procurando por argumentos que comecem com o caractere
-
.Quando acha um argumento começado com
-
, procura emCadeiaDeOpcoes
se tem algum caractere que combine.Se combinar com algum,
variavel
receberá este caractere, caso contráriovariavel
receberá?
.Os passos 1-3 são repetidos até que todos os argumentos da linha de comando tenham sido lidos.
Quando acaba de ler todos os argumentos da linha de comando
getops
retorna um valor falso (não-zero). Isto é útil para verificações em loops (como veremos no exemplo abaixo).
Hmmm... Confuso? Numa primeira olhada é confuso mesmo, é muita informação de uma vez só. Portanto dê uma olhada no exemplo a seguir, execute-o e depois releia este tópico. Não se esqueça de fazer o mais importante: praticar!
#!/bin/bash
# getopts.sh
USAGE="Uso: `basename $0` [-h] [-n nome] [-e email]"
[ $1 ] || { echo $USAGE ; exit 1 ; }
# observe que 'n' e 'e' precisam de argumentos
while getopts 'hn:e:' PARAMETRO; do
# atente para a utilidade do "case"! ;-)
case $PARAMETRO in
h) echo -n "
Script de exemplo de uso do \"getopts\".
Uso: `basename $0` [opções]
Onde as opções podem ser:
-n nome imprime nome
-e email imprime email
-h exibe esta mensagem" ;;
n) NOME=$OPTARG ;;
e) EMAIL=$OPTARG ;;
*) echo -n "Entre \"`basename $0` -h\" para ajuda." ;;
esac
done
[ $NOME ] && echo $NOME
[ $EMAIL ] && echo $EMAIL
Execute este código e tire suas próprias conclusões.