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

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

Entendendo argumentos - meio longo


From: J. F. Mitre
Subject: Entendendo argumentos - meio longo
Date: Sat, 29 Jan 2005 21:11:46 -0200
User-agent: KMail/1.7.2

Olá.
Para resolver um problema de scripts com argumentos não tão diretos, a algum 
tempo eu fiz a função abaixo:


# Combinações a serem testadas

# checkinput -a -i arquivo -s arquivo -b -q
# checkinput -a -i arquivo -b -q -s arquivo
# checkinput -a -i arquivo -s arquivo -b 

# Recebendo todos os inputs para vetor interno
IN=$*

checkinput(){
# Lista de controle : 
# 0 (ZERO), desativado, 1 (UM) ativado, 2 (DOIS) ativado com argumentos
# Opções Default; 
A_STATUS=0
I_STATUS=0
S_STATUS=0
B_STATUS=0
Q_STATUS=0

for j in $IN; do
        
    # Captando os argumentos das opções
    if [ $I_STATUS == 1 ]; then I_STATUS=2; I_ARGUMENT=$j; fi
    if [ $S_STATUS == 1 ]; then S_STATUS=2; S_ARGUMENT=$j; fi
   
    [ $j == -a ] &&  A_STATUS=1 
    [ $j == -i ] &&  I_STATUS=1 
    [ $j == -s ] &&  S_STATUS=1 
    [ $j == -b ] &&  B_STATUS=1 
    [ $j == -q ] &&  Q_STATUS=1

done
}

O script consegue dentro de todas as opções encontrar na lista de argumentos 
do script qual a opção selecionada, se essa opção tem ou não "argumento", 
para posterior execução.

Entretando recentemente eu tive um outro problema, que vou retratar aqui 
atravé de um exemplo MUITO mais simples, mas que também carrega o problema na 
qual aparecia o seguinte:

Exemplo (INSTALAÇÃO DE PACOTES DEBIAN)

Bom imaginem que tivesse "sido eu" o criador do aptget "clone do apt-get" :>), 
para esse problema, eu poderia:

#----------------------------------------------
#!/bin/bash
# MeuScriptExemplo: aptget

checkinputs(){.........} #Declaração da função acima

checkinputs # Executa a função
funcao    # entende_checkinputs_retorna PARAM de forma correta
   #  Transforma OPCAO_STATUS em algo prático PARAM

apt-get $PARAM
#-------------------------------

Como eu usaria

aptget install pacote 
===>ação: baixa e instala o pacote e dependências após confirmação

aptget -d install pacote 
===>ação: baixa o pacote e dependências após confirmação 

aptget -d install pacote -y
===>ação: baixa o pacote e dependências  e NÂO pede confirmação 

Todos esses três exemplos, são perfeitamente compreendidos pelo meu script, 
mas se eu tentasse:
=======================
aptget -d install pacote1 pacote2
=======================
O check inputs não saberia como manipular esse problema, ele não saberia 
manipular o segundo pacote, eu até poderia fazer pequenas modificações e 
resolver o problema inicial, em especial assumindo que todos os últimos 
argumentos estão vinculados a uma mesma opção. mas aí eu não conseguiria ver 
a parte final, ou seja;  o -y ,

aptget -d install pacote1 pacote2 ... pacoteN -y

Em alguns problemas eu pude manipular arquivos, ou seja, se o arquivo existe 
então ele  não é uma opção e sim um argumento de opção, mas nesse caso 
exemplo, percebe-se claramente que na verdade eu nao tenho o menor controle 
sequer em quantos pacotes serão pedidos pelo usuário, que não são arquivos e 
ainda não sei nem ao menos quantas e quais opções viram após esse pacote.

Bom, efim, alguem têm alguma idéia de como tratar multiplas opções cada uma 
tendo muiltiplos argumentos  e ainda totalmente fora de uma ordem prévia

Desculpe pelo tamanho do e-mail, mas quiz detalhar o problema de onde ele 
estava até onde ele foi resolvido e qual especificamente é a dúvida

Procurei na internet mas não achei ninguem que tivesse feito isso, ou pelo 
menos, ninguém que tenha precisado disso, os scripts que conheço no máximo 
tem multiplas opções que quando tem argumentos, tem apenas um,,,,,

Eu já ia até esquecendo: 
enquanto eu não resolvo o problema da forma que eu gostaria, estou usando
algo do tipo:

aptget -d install "pacote1 pacote2 ... pacoteN" -y
# O checkinput entende perfeitamente esse troço aqui em cima

Eu queria abandonar as aspas....

Bem, qualquer ajuda é muito bem vinda
Obrigado.

J. F. Mitre



reply via email to

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