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 emCadeiaDeOpcoesse tem algum caractere que combine.Se combinar com algum,
variavelreceberá este caractere, caso contráriovariavelreceberá?.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
getopsretorna 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.