yuttttttt
(usa Outra)
Enviado em 10/02/2017 - 21:45h
paulo1205 escreveu:
yuttttttt escreveu:
Mas teria que automatizar com eval do mesmo jeito, eu tentei utilizando condicionais antes do eval, e não consegui criar dinâmico como dá para fazer com o case. E não acho necessário dizer para que quero usar o case, o problema é que me deparei com uma situação que mesmo que eu ache outras soluções para ela iria querer saber como faço um case dinâmico, a questão é mais sobre a sintaxe do bash que da logica, logica não tem jeito, eu acredito, mesmo com a maioria sempre discordando, que cada um segue sua linha de raciocino e não deve e nem tem o porque padronizar isso, a não ser que você esteja preocupado com desempenho/segurança e precise fazer de certa maneira que já foi testada ser melhor, mas tudo é muito relativo de qualquer modo. Mas voltando kkkkk eu precisava saber como fazer um case dinâmico, porque caso um dia precise, já terei uma ideia de como fazer, sempre é bom aprender todas as formas possíveis, mesmo que não seja a melhor, para outra situação talvez ela possa ser.
Eu não estou dizendo para você não fazer com
case . Só que, às vezes, ideias preconcebidas podem não ser as melhores soluções para determinados problemas.
A título de informação, minha participação no fórum do VoL costuma ser apenas em comunidades voltadas para programação. Além de gostar de ajudar iniciantes, acho legal pôr meus conhecimentos em prática, e assim não enferrujar; encontrar, uma vez ou outra, problemas pelos quais nunca passei antes e que me obrigam a estudar um pouco para refinar meus conhecimentos; e, sobretudo, gosto de ajudar as pessoas a não incorrer em vícios de programação que um dia forão meus próprios vícios.
No seu caso (sem trocadilho) específico, você optou por uma construção que, na maioria das linguagens de programação, incluindo o próprio shell, foi projetada para ter um conjunto limitado e fixo de casos de uso. Sua forma de contornar essa limitação de projeto foi elaborar um código que, quando é executado, constrói
outro programa , e depois executa esse outro programa de dentro do primeiro programa.
É uma solução válida?
É.
É a melhor?
Depende. Pode ser que seja a única possível, e nesse caso será a necessariamente a melhor. Mas para saber se existem alternativas, só mesmo sabendo o que você quer fazer.
No exemplo mostrado pelo msoliver e adotado por você, todos os casos de uso executam o mesmo comando sobre argumentos diferentes. Num caso assim, bastaria guardar os argumentos num array, e chamar o comando uma única vez após se ter selecionado o argumento desejado. Veja o exemplo abaixo.
declare -a arquivos # digo explicitamente que “arquivos” designa um array,
arquivos=($(ls -1))
if (( ${#arquivos[@]} > 0 )) then
read -p "Informe o índice do arquivo (0 a $((${#arquivos[@]}-1))): " selecao
if [[ -n "$selecao" ]] && (( selecao<${#arquivos[@]} )); then
ls -l ${arquivos[$selecao]}
else
echo "Resposta inválida." >&2
fi
else
echo "Nenhum arquivo disponível para seleção." >&2
fi
Os dados podem variar; o programa não muda. Isso é mais eficiente de executar, mas fácil de entender, e mais fácil de dar manutenção.
E se os comandos variarem de acordo com com a seleção feita, o exemplo do msoliver não funcionaria diretamente. Você teria de ter alguma outra fonte externa de informação sobre qual comando executar sobre qual argumento. Qualquer que seja tal fonte, o programa estático poderia ler dela, e gravar num outro array ou num array associativo, como eu sugeri.
De todo modo, você parece já ter resolvido o problema. Bom para você.
Sim, não disse que você não ajuda, já me ajudou vária vezes aqui no forum, mas eu não consegui entender como fazer isso com if com seu exemplo, acredite eu tentei, ficou quase isso, mas eu estava comparando em vez de trabalhar o index do array como você fez. E sim o eval não seria adequado para esse caso, já que tem sim como fazer com o if, seria um risco desnecessário, alem da perca de desempenho para rodar um "sub-shell". Mas ainda assim é bom saber, agora sei das duas formas, e quero saber de outras, sempre mais, e assim conseguir criar outras, eu to programando em bash a poucos dias, nunca tinha mexido nisso, então não conheço muito a sintaxe dela, e fico limitado por isso as vezes, to tentando aprender, sempre lendo algo aqui ou ali para aprender e criar algo ao mesmo tempo, gosto de estudar assim. E sim vou usar o if é claro, mas como disse já foi bom saber sobre eval, me fez estudar o eval, agora sei porque não é seguro, sei o que é, quais maneiras não usar. E vou estudando assim kkkk
E uma coisa que aprendi errando e esqueci de falar aqui, no seu código você utiliza o ls, colocando ele dentro do array:
arquivos=($(ls -1))
Não é uma boa fazer isso, pode acontecer de você receber um array com seila 90 itens sendo que só tem 4 arquivos no diretório, especialmente se seus arquivos estejam nomeados com espaços ou com nomes extensos. É melhor substitui-lo por:
arquivos=($(pwd)/*.extensao)
ou outros meios, como
find , mas creio que o ls não seja o melhor para esses casos, já tive alguns problemas com ele em algumas situações.
Agradeço mais uma vez a ajuda de todos, aprendi muito com esse tópico, e creio que outros ao visitarem ele, também aprenderão.