Como fazer Script de loop, de uma linha com duas variáveis chamadas a partir de arquivos distintos.

13. Re: Como fazer Script de loop, de uma linha com duas variáveis chamadas a partir de arquivos distintos.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/12/2012 - 18:59h

lcavalheiro,

Eu sei -- e volta e meia lembro isso a todos aqui -- que loops com for requerem cuidados (principalmente com valores que incluem esaços) e têm outras limitações (sobretudo no que diz respeito ao tamanho da linha de comando, o que limita o número de opções que podem ser passas). Mas você pode dar um exemplo de situação em que não dá certo fazer um loop com for dentro do outro? (E, aliás, explicar a distinção entre "não dar certo" e "não funcionar"?)


  


14. Re: Como fazer Script de loop, de uma linha com duas variáveis chamadas a partir de arquivos distintos.

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 27/12/2012 - 11:46h

paulo1205 escreveu:

lcavalheiro,

Eu sei -- e volta e meia lembro isso a todos aqui -- que loops com for requerem cuidados (principalmente com valores que incluem esaços) e têm outras limitações (sobretudo no que diz respeito ao tamanho da linha de comando, o que limita o número de opções que podem ser passas). Mas você pode dar um exemplo de situação em que não dá certo fazer um loop com for dentro do outro? (E, aliás, explicar a distinção entre "não dar certo" e "não funcionar"?)


Não dar certo = fazer algo diferente daquilo que você tinha em mente.
Não funcionar = não fazer nada.

Exemplo: um script bobo para renomear arquivos que faz o seguinte: procura arquivos com dois patterns para nome de arquivo diferentes e se encontrar um arquivo que satisfaz essas duas condições ele renomeia o arquivo. Se você fizer isso com um for dentro do outro, você vai ter um processamento três ou quatro vezes maior do que o necessário.
As chances de se errar com um for dentro de outro for e conseguir um resultado diferente do esperado são altas, ainda mais se você tem em mente o laço for-next do Basic ;-)


15. Re: Como fazer Script de loop, de uma linha com duas variáveis chamadas a partir de arquivos distintos.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/12/2012 - 14:32h

lcavalheiro escreveu:

Não dar certo = fazer algo diferente daquilo que você tinha em mente.
Não funcionar = não fazer nada.


Mesmo correndo o risco de receber a pecha de "chato" por alongar o assunto, ouso dizer que nunca vi as coisas definidas desse modo.

Parando para pensar um pouco nas definições que você deu, entendo que "não fazer nada" é um caso particular de "fazer algo diferente daquilo que você tinha em mente". Em todo caso -- e aqui assumo um erro meu --, nenhuma das duas expressões, se literalmente tomadas, estão corretas, porque incompletas ("não dar certo" é um somente erro gramatical, e "não funcionar" significa ser inerte, morto, sem função). Entendidas como deveriam ter sido expressas, no entanto, não sei se "não dar [resultado] certo" e "não funcionar [corretamente]" são tão diferentes assim.

A rigor, porém, nenhum programa faz "aquilo que você tinha em mente", mas tão-somente aquilo que você manda ser feito. A coincidência entre uma coisa e outra depende da competência de quem está programando. Salvo em raros casos envolvendo defeito de hardware, um programa que faça a maior lambança destrutiva não é um programa que "não deu certo" ou que "não funcionou", mas um programa que, por ter sido mal construído ou não levar em consideração cenários diferentes do esperado, funcionou bem o bastante, produzindo o resultado que deterministicamente estava fadado a produzir, em função do código que estava nele escrito.

Exemplo: um script bobo para renomear arquivos que faz o seguinte: procura arquivos com dois patterns para nome de arquivo diferentes e se encontrar um arquivo que satisfaz essas duas condições ele renomeia o arquivo. Se você fizer isso com um for dentro do outro, você vai ter um processamento três ou quatro vezes maior do que o necessário.


Pode até ser, mas isso será consequência da pouca habilidade do programador que usou mal o recurso, não de uma falha intrínseca ou propensão a erros do comando for ou da forma como ele é implementado pelo shell.

As chances de se errar com um for dentro de outro for e conseguir um resultado diferente do esperado são altas, ainda mais se você tem em mente o laço for-next do Basic ;-)


O for do shell realmente não é como o do BASIC: este último é um gerador de sequências (estritamente númericas -- pelo menos no BASIC do meu tempo), ao passo que o do shell percorre uma sequência predefinida de valores determinísticos. O do shell, portanto, é mais simples.

(NOTA: O bash tem uma sintaxe alternativa do for, muito parecida com a do comando de mesmo nome existente na linguagem C. É óbvio que as considerações anteriores não se aplicam a esta sintaxe, mas sim à tradicional "for variavel in valor [...]; do comando [; ...] ; done", que era a que estava no escopo original deste tópico.)


16. Re: Como fazer Script de loop, de uma linha com duas variáveis chamadas a partir de arquivos distintos.

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

Enviado em 27/12/2012 - 17:29h

paulo1205 escreveu:

lcavalheiro escreveu:

Não dar certo = fazer algo diferente daquilo que você tinha em mente.
Não funcionar = não fazer nada.


Mesmo correndo o risco de receber a pecha de "chato" por alongar o assunto, ouso dizer que nunca vi as coisas definidas desse modo.

Parando para pensar um pouco nas definições que você deu, entendo que "não fazer nada" é um caso particular de "fazer algo diferente daquilo que você tinha em mente". Em todo caso -- e aqui assumo um erro meu --, nenhuma das duas expressões, se literalmente tomadas, estão corretas, porque incompletas ("não dar certo" é um somente erro gramatical, e "não funcionar" significa ser inerte, morto, sem função). Entendidas como deveriam ter sido expressas, no entanto, não sei se "não dar [resultado] certo" e "não funcionar [corretamente]" são tão diferentes assim.

A rigor, porém, nenhum programa faz "aquilo que você tinha em mente", mas tão-somente aquilo que você manda ser feito. A coincidência entre uma coisa e outra depende da competência de quem está programando. Salvo em raros casos envolvendo defeito de hardware, um programa que faça a maior lambança destrutiva não é um programa que "não deu certo" ou que "não funcionou", mas um programa que, por ter sido mal construído ou não levar em consideração cenários diferentes do esperado, funcionou bem o bastante, produzindo o resultado que deterministicamente estava fadado a produzir, em função do código que estava nele escrito.

Exemplo: um script bobo para renomear arquivos que faz o seguinte: procura arquivos com dois patterns para nome de arquivo diferentes e se encontrar um arquivo que satisfaz essas duas condições ele renomeia o arquivo. Se você fizer isso com um for dentro do outro, você vai ter um processamento três ou quatro vezes maior do que o necessário.


Pode até ser, mas isso será consequência da pouca habilidade do programador que usou mal o recurso, não de uma falha intrínseca ou propensão a erros do comando for ou da forma como ele é implementado pelo shell.

As chances de se errar com um for dentro de outro for e conseguir um resultado diferente do esperado são altas, ainda mais se você tem em mente o laço for-next do Basic ;-)


O for do shell realmente não é como o do BASIC: este último é um gerador de sequências (estritamente númericas -- pelo menos no BASIC do meu tempo), ao passo que o do shell percorre uma sequência predefinida de valores determinísticos. O do shell, portanto, é mais simples.

(NOTA: O bash tem uma sintaxe alternativa do for, muito parecida com a do comando de mesmo nome existente na linguagem C. É óbvio que as considerações anteriores não se aplicam a esta sintaxe, mas sim à tradicional "for variavel in valor [...]; do comando [; ...] ; done", que era a que estava no escopo original deste tópico.)


As considerações que você expôs são válidas. Apenas quis alertar ao garoto dos perigos de se fazer um laço (principalmente for) dentro de outro laço ;-)



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts