shell-script-pt
[Top][All Lists]
Advanced

[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




 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]