[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RES: [shell-script] Getopts
From: |
Julio Cezar Neves - DATAPREVRJ |
Subject: |
RES: [shell-script] Getopts |
Date: |
Fri, 19 May 2006 09:11:55 -0300 |
Aê Ricardo,
aí vai uma seção do meu livro que fala sobre este pouco utilizado cmd.
Fatiando opções
O comando getopts recupera as opções e seus argumentos de uma lista de
parâmetros de acordo com a sintaxe, isto é, letras após um sinal de menos
(-) seguidas ou não de um argumento; no caso de somente letras elas devem
ser agrupadas. Você deve usar este comando para "fatiar" opções e argumento
passados para o seu script.
Sintaxe: getopts cadeiadeopcoes nome
A cadeiadeopcoes deve explicitar uma cadeia de caracteres com todas as
opções reconhecidas pelo script, assim se o script reconhece as opções -a -b
e -c, cadeiadeopcoes deve ser abc. Se você deseja que uma opção seja seguida
por um argumento, ponha dois-pontos (:) depois da letra, como em a:bc. Isto
diz ao getopts que a opção -a tem a forma:
-a argumento
Normalmente um ou mais espaços em branco separam o parâmetro da opção; no
entanto, getopts também manipula parâmetros que vêm cola-dos à opção como
em:
-aargumento
cadeiadeopcoes não pode conter interrogação (?).
O nome constante da linha de sintaxe acima define uma variável que cada vez
que o comando getopts for executado, receberá a próxima opção dos parâmetros
posicionais e a colocará na variável nome.
getopts coloca uma interrogação (?) na variável definida em nome se ele
achar uma opção não definida em cadeiadeopcoes ou se não achar o ar-gumento
esperado para uma determinada opção.
Como já sabemos, cada opção passada por uma linha de comandos tem um índice
numérico, assim, a primeira opção estará contida em $1, a segunda em $2, e
assim por diante. Quando o getopts obtém uma opção, ele arma-zena o índice
do próximo parâmetro a ser processado na variável OPTIND.
Quando uma opção tem um argumento associado (indicado pelo : na
cadeiadeopcoes), getopts armazena o argumento na variável OPTARG. Se uma
opção não possui argumento ou o argumento esperado não foi encon-trado, a
variável OPTARG será "matada" (unset).
O comando encerra sua execução quando:
§ Encontra um parâmetro que não começa por menos (-);
§ O parâmetro especial -- marca o fim das opções;
§ Quando encontra um erro (por exemplo, uma opção não reconhecida).
Exemplo: O exemplo abaixo é meramente didático, servindo para mostrar, em um
pequeno fragmento de código, o uso pleno do comando.
$ cat getoptst.sh
#!/bin/sh
# Execute assim:
#
# getoptst.sh -h -Pimpressora arq1 arq2
#
# e note que as informacoes de todas as opcoes sao exibidas
#
# A cadeia 'P:h' diz que a opcao -P eh uma opcao complexa
# e requer um argumento, e que h eh uma opcao simples que nao requer
# argumentos.
while getopts 'P:h' OPT_LETRA
do
echo "getopts fez a variavel OPT_LETRA igual a '$OPT_LETRA'"
echo " OPTARG eh '$OPTARG'"
done
used_up=`expr $OPTIND - 1`
echo "Dispensando os primeiros \$OPTIND-1 = $used_up argumentos"
shift $used_up
echo "O que sobrou da linha de comandos foi '$*'"
Para entendê-lo melhor, vamos executá-lo como está sugerido em seu
cabeçalho:
$ getoptst.sh -h -Pimpressora arq1 arq2
getopts fez a variavel OPT_LETRA igual a 'h'
OPTARG eh ''
getopts fez a variavel OPT_LETRA igual a 'P'
OPTARG eh 'impressora'
Dispensando os primeiros $OPTIND-1 = 2 argumentos
O que sobrou da linha de comandos foi 'arq1 arq2'
Desta forma, sem ter muito trabalho, separei todas as opções com seus
respectivos argumentos, deixando somente os parâmetros que foram pas-sados
pelo operador para posterior tratamento.
Repare que se tivéssemos escrito a linha de comando com o argumento
(impressora) separado da opção (-P), o resultado seria exatamente o mesmo,
exceto pelo OPTIND, já que neste caso ele identifica um conjunto de três
opções/argumentos e no anterior somente dois. Veja só:
$ getoptst.sh -h -P impressora arq1 arq2 Opção -P separada do
argumento
getopts fez a variavel OPT_LETRA igual a 'h'
OPTARG eh ''
getopts fez a variavel OPT_LETRA igual a 'P'
OPTARG eh 'impressora'
Dispensando os primeiros $OPTIND-1 = 3 argumentos
O que sobrou da linha de comandos foi 'arq1 arq2'
Repare, no exemplo a seguir, que se passarmos uma opção inválida, a variável
$OPT_LETRA receberá um ponto-de-interrogação (?) e a $OPTARG será "apagada"
(unset).
$ getoptst.sh -f -Pimpressora arq1 arq2 A opção -f não é valida
./getoptst.sh: illegal option -- f
getopts fez a variavel OPT_LETRA igual a '?'
OPTARG eh ''
getopts fez a variavel OPT_LETRA igual a 'P'
OPTARG eh 'impressora'
Dispensando os primeiros $OPTIND-1 = 2 argumentos
O que sobrou da linha de comandos foi 'arq1 arq2'
[ ]s,
Julio Cezar Neves
Tel:+55 21 2555-6148 / +55 21 8112-9988
Fax: +55 21 2555-6154
http://www.julioneves.com
| -----Mensagem original-----
| De: Ricardo A. Reis [mailto:address@hidden]
| Enviada em: quinta-feira, 18 de maio de 2006 21:37
| Para: address@hidden
| Assunto: [shell-script] Getopts
|
|
| Caros,
|
| Eu estou quase matando o getopts :-( , brincadeiras a
| parte eu estou
| com dificuldades em usar o getopts
| da forma como o meu probrama precisa de opcoes.
| Cortei uma parte do script, basicamente eu preciso de opcoes :
|
| -v -s .... ou -vs ..... ou -s ... -v
| -q -s .... ou -vs ..... ou -s ... -q
| -v -c .... ou -vc ..... ou -c ... -v
| -q -c .... ou -vc ..... ou -c ... -q
|
| A opcoes "v e q" apenas precisam re-declarar a variavel
| OUT, que deve
| ser passada para a funcao search,
| existe uma forma facil de fazer isso ?
|
|
| ------------------------------------------
| OUT="SHORT"
| while getopts "hv:q:s:c:" OPT ;do
| case "$OPT" in
| "c")
| if [ $# -eq 1 ];then help ;fi
| CATEGORY=$OPTARG
| search $OUT $OPT $CATEGORY
| ;;
| "q")
| if [ $# -eq 1 ];then help ;fi
| OUT="QUIET"
| ;;
| "s")
| if [ $# -eq 1 ];then help ;fi
| STRING=$OPTARG
| search $OUT $OPT $STRING
| ;;
| "v")
| if [ $# -eq 1 ];then help ;fi
| OUT="VERBOSE"
| ;;
| *|h)
| help ;;
| esac
| done
| ------------------------------
|
|
| Atenciosamente
|
| Ricardo A. Reis
| UNIFESP
| Unix and Network Admin
|
|
| _______________________________________________________
| Abra sua conta no Yahoo! Mail: 1GB de espaço, alertas de
| e-mail no celular e anti-spam realmente eficaz.
| http://br.info.mail.yahoo.com/
|
|
| ---------------------------------------------------------------------
| Esta lista não admite a abordagem de outras liguagens de
| programação, como perl, C etc. Quem insistir em não seguir
| esta regra será moderado sem prévio aviso.
| ---------------------------------------------------------------------
| Sair da lista: address@hidden
| ---------------------------------------------------------------------
| Esta lista é moderada de acordo com o previsto em
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil
Links do Yahoo! Grupos
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- RES: [shell-script] Getopts,
Julio Cezar Neves - DATAPREVRJ <=