[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Recebimento e passagem de parâmetro posicional
From: |
Leandro Santiago |
Subject: |
Re: [shell-script] Recebimento e passagem de parâmetro posicional |
Date: |
Wed, 24 Oct 2007 14:45:11 -0300 |
ENgraçado...
O que você quer é arrumar um jeito de interpretar os parâmetros passados
pela linha de comandos, acredito eu.
Há várias opções, como o getopts, mas eu implementei a minha própria solução
que, embora seja maior em tamanho, é mais legível, além de ser mais
personalizável.
Vou colocar um breve trecho de um programinha que estou fazendo, que utiliza
este recurso:
# Crio o vetor que guarda todos os parâmetros
j=0
for i
{
PARAMET[$((j++))]="$i"
}
# Indice verificado
INDICE=0
# Indica se devo parar a verificação
FIMCADEIA=false
# A quantidade de parâmetros que devo verificar (poderia pegar o tamanho do
vetor, mas assim também funciona)
QtdPar=$#
# Enquanto houver parãmetros para verificar
# e não estiver acabado a lista
while (( INDICE<QtdPar )) && ( ! $FIMCADEIA )
do
case ${PARAMET[$INDICE]} in # Opções que necessitam de argumentos
-p|-r|-a|--packager|--release|--arquiteture|-d|--desc|\
--destdir|-R|--root|--extra-docs|--package-name|-N|--packager-name|\
-V|--package-version|-D|--slack-desc|\
--deps|--docsdir|--move|--icon|\
--type|-T)
# Aqui verifico parâmetros que necessitam de argumento
# juntei tudo num case para facilitar a localização
# e modificação
if ((INDICE<QtdPar))
then
((INDICE++))
{
if ((${#PARAMET[((INDICE))]}>0))
then
case ${PARAMET[((INDICE-1))]} in
-p|--packager)
PKPACKAGER=${PARAMET[((INDICE))]};;
-r|--release) PKRELEASE=${PARAMET[((INDICE))]};;
-a|--arquiteture)
PKARCH=${PARAMET[((INDICE))]};;
-d|--desc) DESCFILE=${PARAMET[((INDICE))]};;
-R|--root) PKROOTDIR=${PARAMET[((INDICE))]};;
-V|--package-version)
PKVERSION=${PARAMET[((INDICE))]};;
-D|--slack-desc)
DESCREADY=${PARAMET[((INDICE))]};;
-N|--package-name)
PKNOMESEMVER=${PARAMET[((INDICE))]};;
-T|--type) PKMAKETYPE=${PARAMET[((INDICE))]};;
--root) PKROOTDIR=${PARAMET[((INDICE))]};;
--extra-docs) AdicionaDocsExtras
${PARAMET[((INDICE))]};;
--packager-name)
PKPACKAGERNAME=${PARAMET[((INDICE))]};;
--destdir) PKDEST=${PARAMET[((INDICE))]};;
--docsdir)
PKPACKAGEDOCSDIR=${PARAMET[((INDICE))]};;
--move) PKMOVEDIR=${PARAMET[((INDICE))]};;
--icon) PKPACKAGEICON=${PARAMET[((INDICE))]};;
--deps) AddDeps ${PARAMET[((INDICE))]};;
# Senão, se o parâmetro dor inválido, termino a
verificação
*) echo ${PARAMET[((INDICE-1))]}
$MSGNEEDARGUMENT
FIMCADEIA=true
;;
esac
else
echo ${PARAMET[((INDICE-1))]} precisa de um
argumento
FIMCADEIA=true
fi
}
fi
;;
# Modo interativo
-i|--interactive) PKINTERACTIVE=true
;;
# Modo não-interativo
-I|--non-interactive) PKINTERACTIVE=false
;;
# Stripar binários
-s|--enable-strip) PKSTRIP=true
;;
# Não stripar binários
-b|--disable-strip) PKSTRIP=false
;;
# Não criar o pacote, somente a árvore de diretórios e arquivos
--dontcreate) PKCREATE=false
;;
# Criar pacote (normalmente default=true)
--create) PKCREATE=true
;;
# Não executar o make install
--dontmake) PKMAKEPKINSTALL=false
;;
# Instalar o pacote depois de criá-lo
--install) PKINSTALL=true
;;
# Não Instalar o pacote depois de criá-lo
--dontinstall) PKINSTALL=false
;;
# Exibir tela de ajuda
--help|-h) HelpView ; FIMCADEIA=true;
;;
# Exibir tela de ajuda
--version|-v) ExibeVersion ; FIMCADEIA=true;
;;
# Apagar arquivos temporários
--clean) PKCLEAN=true
;;
# Não apagar arquivos temporários
--dontclean) PKCLEAN=false
;;
# Se o parâmetro for incorreto, paro a verificação
*) echo "$MSGINVALIDPARAMETER ${PARAMET[((INDICE))]}"
FIMCADEIA=true
;;
esac
((INDICE++))
# Se passei um parâmetro errado, imediatamente finalizo o programa
if $FIMCADEIA
then
exit 4 ## Porquê 4?
fi
done
Nele você pode utilizar parâmetros -c curtos ou parâmetros --longos, ou
parâmetros do -jeito que você quer, como ao estilo apt-get, etc. As suas
mensagens de erro são personalizáveis, e é bem fácil de entender, pelo fato
de eu guardar tudo num vetor, o que facilita a sua implementação em outras
linguagens.
Mas não permite que você agrupe vários arqumentos, como em
$ ls -lahd # que equivale à ls -l -a -h -d
Mas funciona muito bem para o que eu preciso. Tem algumas albiguidades, pois
faz tempo que eu não mexo na lógica da verificação, mas você pode utilizar
como bem quiser.
Há um tempo atrás publiquei uma dica no Vivaolinux que trata deste assunto.
Se puder, dê uma lida:
http://www.vivaolinux.com.br/dicas/verDica.php?codigo=8072
Vai parecer que eu não entendi sua pergunta, mas o primeiro for (o que
começa com um j) pode te ajudar ;-)
[As partes desta mensagem que não continham texto foram removidas]