[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