Ponto onde volta a executar depois da função

1. Ponto onde volta a executar depois da função

luiz
luizsouza99

(usa Linux Mint)

Enviado em 20/07/2017 - 13:45h

Fiz um script com essa estrutura:

função
loop
if A
if B
if C
if D

Vamos supor que ele entre no if B, ele vai chamar a função, só que depois de executar a função eu preciso que ele continue descendo para executar o loop novamente, só que ao invés disso ele continua executando só que a partir do if C.

Tem alguma forma de criar uma função que após executada, o script vá executando as linhas a seguir como acontece normalmente, no meu caso ele executaria o loop, if A, if B, FUNÇÃO, loop, if A, if B, if C ... até chamar a função novamente.

Obrigado!


  


2. Re: Ponto onde volta a executar depois da função

Hector Nagao
heckjp

(usa elementary OS)

Enviado em 20/07/2017 - 13:52h

Pelo que eu entendi , a tua LÓGICA está errada e a forma como está funcionando está certa. Se você fizer isto que quer, ao executar a função no if B ele vai entrar em loop infinito e sempre executará a função e voltara pro if A.


3. Re: Ponto onde volta a executar depois da função

Patrick Costa da Silva
patrickpcs

(usa Nenhuma)

Enviado em 20/07/2017 - 13:55h

Algo de errado não está certo na sua lógica....

Vejamos se entendi...


função() {
funfando a função
}
loop; do
if a
if b (chama função)
if c
if d
done


O funcionamento está certo, mas para atender o seu pedido você deve fazer o seguinte....
Dentro de cada if a ser executado, logo após chamar a função você também deve executar o comando continue. Assim ele volta para o inicio do loop.




while true; do
if [condição A]; then
função; continue
fi
if [condição B]; then
função; continue
fi
if [condição C]; then
função; continue
fi
if [condição D]; then
função; continue
fi
done


O comando continue é parecido com o break, sendo que o break aborta a execução do loop, já o continue manda de volta para o inicio do loop.



Mas o seu texto também não tá fazendo muito sentido, você não está se contra dizendo?

Vamos supor que ele entre no if B, ele vai chamar a função, só que depois de executar a função eu preciso que ele continue descendo para executar o loop novamente, só que ao invés disso ele continua executando só que a partir do if C.

Afinal de contas você quer que continue descendo ou não? Pois se continuar descendo ele ira para o if C.
Ou você quer que volte para o inicio do loop?


4. Re: Ponto onde volta a executar depois da função

luiz
luizsouza99

(usa Linux Mint)

Enviado em 20/07/2017 - 20:15h

Usei o continue mas não deu certo no loop para o que estou precisando.

imaginem que o script vai tratar o texto abaixo:
"sistema linux, o melhor do mundo"

ele entra num loop infinito e saberá a hora de sair quando acabarem as silabas/texto.

IF A = pega as 4 primeiras letras (sist) e verifica se existe um audio correspondente na pasta, se tiver ele chama a função, se não ele continua descendo
IF B = pega as 3 primeiras letras (sis) , verifica se existe audio na pasta, se tiver chama a função, se não continua descendo
IF C = verifica 2 primeiras letras ...
IF D = verifica a primeira letra ...

eu nao quero chamar a função pelo if B, poderá ser qualquer if

na verdade já tenho esse script funcionando, mas como ele vai tratar grandes quantidades de texto eu estou otimizando, tirando processos desnecessários, como por exemplo executar um loop inteiro sendo que muitas vezes a resoluçao vem no IF A.

eu sei que posso colocar tudo já dentro do if, ao invés de jogar para a função, mas isso implicaria em executar o loop inteiro desnecessariamente.

entao preciso que o script siga o fluxo, quando terminar a função ele continua descendo, se isso acontecer nas proximas linhas ele entra no loop novamente com as informaçoes atualizadas (inclusive usarei isso para verificar se o loop deve parar ou nao)

quando ele termina a função e pula para o if C por exemplo mata a minha busca porque ele começará buscando 2 letras, sendo que a lógica de busca é: 4,3,2,1.

o que eu preciso saber, como eu faço para a função seguir o fluxo ao invés de pular lá para baixo.


5. Re: Ponto onde volta a executar depois da função

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 21/07/2017 - 12:00h

luizsouza99 escreveu:

Usei o continue mas não deu certo no loop para o que estou precisando.

imaginem que o script vai tratar o texto abaixo:
"sistema linux, o melhor do mundo"

ele entra num loop infinito e saberá a hora de sair quando acabarem as silabas/texto.

IF A = pega as 4 primeiras letras (sist) e verifica se existe um audio correspondente na pasta, se tiver ele chama a função, se não ele continua descendo
IF B = pega as 3 primeiras letras (sis) , verifica se existe audio na pasta, se tiver chama a função, se não continua descendo
IF C = verifica 2 primeiras letras ...
IF D = verifica a primeira letra ...

eu nao quero chamar a função pelo if B, poderá ser qualquer if

na verdade já tenho esse script funcionando, mas como ele vai tratar grandes quantidades de texto eu estou otimizando, tirando processos desnecessários, como por exemplo executar um loop inteiro sendo que muitas vezes a resoluçao vem no IF A.

eu sei que posso colocar tudo já dentro do if, ao invés de jogar para a função, mas isso implicaria em executar o loop inteiro desnecessariamente.

entao preciso que o script siga o fluxo, quando terminar a função ele continua descendo, se isso acontecer nas proximas linhas ele entra no loop novamente com as informaçoes atualizadas (inclusive usarei isso para verificar se o loop deve parar ou nao)

quando ele termina a função e pula para o if C por exemplo mata a minha busca porque ele começará buscando 2 letras, sendo que a lógica de busca é: 4,3,2,1.

o que eu preciso saber, como eu faço para a função seguir o fluxo ao invés de pular lá para baixo.


Boa tarde Luiz.
Sendo:
TEXTO="SISTEMA linux, o melhor do mundo"
Você deseja pegar os caracteres seguindo a lógica "4 3 2 1", tendo:
SIST
SIS
SI
S
E verificar se existe um áudio correspondente na pasta.
Duvidas:
O nome do arquivo de áudio a ser procurado seria o "SIST, SIS, SI ou S",
e o nome da pasta, segue a mesma lógica? SIST . . . .

att.:
Marcelo Oliver




6. Re: Ponto onde volta a executar depois da função

luiz
luizsouza99

(usa Linux Mint)

Enviado em 21/07/2017 - 12:03h

o nome do audio é identico ao nome da silaba (caso tenha)
o nome da pasta é padrão e nunca me deu problemas


7. Re: Ponto onde volta a executar depois da função

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 21/07/2017 - 20:02h

luizsouza99 escreveu:

o nome do audio é identico ao nome da silaba (caso tenha)
o nome da pasta é padrão e nunca me deu problemas


Boa noite Luiz.
Segue sugestão . . .
TXT="SISTEMA LINUX"
DIR="PADRAO"
for X in {4..1};do
AUDIO="${TXT:0:$X}"
if [ $(ls -1 ${DIR}/${AUDIO}.* 2> LIXO.txt ) ];then
echo "ENCONTRADO"
else
echo "NAO ENCONTRADO"
fi
done


att.:
marcelo oliver



8. Re: Ponto onde volta a executar depois da função

luiz
luizsouza99

(usa Linux Mint)

Enviado em 23/07/2017 - 12:09h

O seu código é muito inteligente e compacto, não cheguei nesse nível ainda rsrs.

O script é um sintetizador de voz, não tem como usar o mesmo if, tem uma série de verificações que são bem individualizadas para identificar o texto evitando erros como por exemplo: pegar geRAis e nao geRAIs e ao mesmo tempo ele consegue reconhecer a palavra "gerado" sem dar erro.

por isso a melhor opção seria ir fazendo essas verificações e quando o script identificar o padrão correto ele já pula para a função (ao invés de rodar todo o loop), executa o comando e depois segue o fluxo, ou seja cai no loop novamente. Se a função tivesse essa característica seria a melhor opção e mais rápida.

De qualquer forma te agradeço muito, vou usar seu loop ao invés do "while" e assim vou conseguir eliminar alguns processos desnecessários.


9. Re: Ponto onde volta a executar depois da função

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 23/07/2017 - 20:24h

luizsouza99 escreveu:

O seu código é muito inteligente e compacto, não cheguei nesse nível ainda rsrs.

O script é um sintetizador de voz, não tem como usar o mesmo if, tem uma série de verificações que são bem individualizadas para identificar o texto evitando erros como por exemplo: pegar geRAis e nao geRAIs e ao mesmo tempo ele consegue reconhecer a palavra "gerado" sem dar erro.

por isso a melhor opção seria ir fazendo essas verificações e quando o script identificar o padrão correto ele já pula para a função (ao invés de rodar todo o loop), executa o comando e depois segue o fluxo, ou seja cai no loop novamente. Se a função tivesse essa característica seria a melhor opção e mais rápida.

De qualquer forma te agradeço muito, vou usar seu loop ao invés do "while" e assim vou conseguir eliminar alguns processos desnecessários.


Boa noite Luiz.
Com o comando:
ls -1 ${DIR}/${AUDIO}.* 2> LIXO.txt
Não existe a possibilidade de "pegar" um arquivo que não seja exatamente igual ao "AUDIO",
Veja o exemplo:
user@debian:~$ ls -1 *.txt
geração.txt
gerado.txt
gera.txt

user@debian:~$ ls -1 gera.txt
gera.txt
Pegou somente "gera.txt" . . .

Att.:
Marcelo Oliver




10. Re: Ponto onde volta a executar depois da função

luiz
luizsouza99

(usa Linux Mint)

Enviado em 23/07/2017 - 20:48h

Não, o script primeiro procura a palavra inteira se não achar ele vai procurando por silabas.

para procurar só palavras inteiras eu teria que gravar o dicionario todo em audio.


11. Re: Ponto onde volta a executar depois da função

luiz
luizsouza99

(usa Linux Mint)

Enviado em 23/07/2017 - 21:08h

agora que entendi o que quis dizer,

as palavras são muito peculiares, me lembro que no começo ele sempre resolvia alguma palavra de forma errada e eu tinha que fazer um "plugin" para ele conseguir ler/converter elas de forma correta.

por exemplo a palavra paralisaçao:

ele deveria pegar assim: "pa" -> "ra" -> "li" -> "sa" -> "ção"

sem plugins ele faria assim (loop puro): "par" -> "a" -> "lis" ->"a" -> "çao"

porque o loop 3 pegaria antes do 2 neste caso em especifico.

mesmo criando um banco de silabas gigantesco teríamos erros desse tipo, já tenho o script funcionando e a intenção é diminuir o tempo de resolução de textos, assim os usuários poderão converter até livros para mp3 sem demorar uma eternidade.

vou ver se consigo fazer algumas funções que ficam pulando de uma para outra sem loop, mas que consiga fazer certos controles como o loop.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts