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

[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]



reply via email to

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