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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] getopts


From: Julio Neves
Subject: Re: [shell-script] getopts
Date: Wed, 14 Nov 2001 14:14:22 -0300

Favor responder a address@hidden
Para:   address@hidden
cc: 
Assunto:        [shell-script] getopts

Pessoal,
alguém sabe a função exata do comando getopts, o que exatamente ele faz.
Procurei na internet e não achei nada.

valeu

==================================================================================
Olá grupo!
Ai vai uma seção que havia escrito para publicar na próxima edição do meu 
livro. Saindo das minhas características, fiz uma tradução e, solicito aos 
colegas que façam comentários em geral. 

[ ]s a todos,
Julio Cezar Neves


Sintaxe: getopts cadeiadeopcoes nome

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.

A cadeiadeopcoes deve explicitar uma cadeia de caracteres com todas as opçoes 
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 
qua 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 colados à 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 colocorá 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 argumento esperado 
para uma determinada opção.

Como já sabemos, cada opção passada por um linha de comandos tem um indice 
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 armazena 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 
encontrado, 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:

Dizem que os bons programadores são preguiçosos afinla quem tem de 
trabalhar é o computador e não o administrador. Eu sempre ouvi dizer "É eu 
deveria automatizar isto ou aquilo, mas eu estou sem tempo...".

Um bom e preguiçoso administrador sempre automatizará as tarefas 
repetitivas. Toda hora você é obrigado a conferir tails de seus logs, 
algumas vezes logs de mail, outras de syslogs e ainda de web ou de tudo 
junto.

Finalmente decidi-me a escrever um script que listasse meus tails. Note! 
Eu sempre escrevi scripts com $1, $2, ... e quando eu cheguei além de um 
certo grau de complexidade, eu desisti, fiquei preguiçoso, e usei o 
getopts.

Obs: No script abaixo, .mojo é o domínio do site de weblogs.

Aqui vai o script que chamei tailer:

#!/bin/sh

me=`id -un`
Err_Lev="0"
Err_Msg=""
_site=""
_verbose=""
_mail=""
_syslog=""
_weblog=""

print_usage()
{
    echo "$Err_Msg"
    echo "tailer [-h -m -s ] [ -w [<WEBSITE>]] [ -v ] -OU-"
    echo "tailer -k"
    echo "-h = usage  (help)"
    echo "-k Mata todos os tails para este uid" 
    echo "-m Faz o tail dos logs do mail "
    echo "-s Faz o tail do syslog"
    echo "-v verbose (info, warning no mail; acessos em website"
    echo "-w [website] tail httpd logs [ e site-logs para <website>]"
    exit $Err_Lev
}

kill_tails()
{
ps aux | grep tail | grep "\-f" | while read u p o
do
    if  [ "$u" = "$me" ]
    then
        kill "$p"
    fi
done
}

tail_mail()
{
echo "_verbose is ${_verbose}" 
tail -f /var/log/mail/errors &
if  [ ! "$_verbose" ]
then
    echo "VERBOSE MAIL"
    tail -f /var/log/mail/warnings &
    tail -f /var/log/mail/info &
fi
}

tail_syslog()
{
tail -f /var/log/messages &
}

tail_weblog()
{
tail -f /var/log/httpd/error_log &
if  [ ! "$_verbose" ]
then
    echo "verbose tailing access log ${_verbose}"
    tail -f /var/log/httpd/access_log &
fi
if [ ! "$_site" ]
then
    tail -f /home/virtual/$1/logs/$1.mojo-error_log & 
    if  [ ! "$_verbose" ]
    then
        tail -f /home/virtual/${1}/logs/${1}.mojo-access_log &
    fi
fi
}

while getopts "hkmsw:v" option
do
    case "${option}" in
        h)  print_usage
            ;;
        k)  kill_tails 
            exit 0
            ;;
        m)  _mail="TRUE"
            ;;
        s)  _syslog="TRUE"
            ;;
        w)  _site="${optargs}" 
            _weblog="TRUE"
            ;;
        v)  _verbose="TRUE" 
            echo "_verbose is ${_verbose}"
            ;;
        *)  Err_Lev="1"
            Err_Msg="Invalid Option"
            print_usage
            ;;
    esac
done

if  [ ! "$_mail" ]
then
    echo "Fazendo o tail do mail"
    tail_mail
fi
if  [ ! "$_syslog" ]
then
    echo "Fazendo o tail do syslog"
    tail_syslog
fi
if  [ ! "$_weblog" ]
then
    echo "Fazendo o tail do weblog do site: $_site"
    tail_weblog
fi




reply via email to

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