script quase impossivel de se fazer [RESOLVIDO]

13. Re: script quase impossivel de se fazer [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/04/2009 - 22:29h

fiz um assim

===================================================

#!/bin/bash

clear #limpar tudo que tem no terminal

echo "Todas as combinaçoes numéricas possíveis de A á Z!!" #exibiçao no topo do programa
echo
echo
echo
if [ -e combinações-de-A_Z.txt ]
then
rm -fR combinações-de-A_Z.txt
touch combinações-de-A_Z.txt
else
touch combinações-de-A_Z.txt
fi

n=0

while [ $n -le 25 ]
do
echo `echo {A..Z}` >> combinações-de-A_Z.txt
done

=================================================

o resultado foi

==============================================

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

====================================================

nao eh todas as combinaçoes possiveis =/

mas vamo tentando que vai dar certo

eh coisa simples, mas eh um desafio e tanto


  


14. descontrair um pouco

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/04/2009 - 22:55h

andei fuçando muito, e acabei encontrando uma coisa muito interessante

o programa Xdialog, ele eh capas de carregar um script em modo grafico


um ex:
=================================

Xdialog --title "Último exemplo - checklist" --center --checklist \
"Como se pronuncia Linux?" \
0 0 0 \
"Opção 1" "Láinucs" off \
"Opção 2" "Lenocs" off \
"Opção 3" "Linúcs" off \
"Opçào 4" "Línucs" on \
"Opção 5" "GNUUU/Linux" off

=====================================

xD

vou voltar a tentar quebrar meu desafio


15. letras

M4iir1c10
m4iir1c10

(usa Arch Linux)

Enviado em 10/04/2009 - 00:05h

use um array para as variaveis

#!/bin/bash
letras[0]=A
letras[1]=B
letras[2]=C
...
letras[26]=Z

numero=0
while [ $numero -le 25 ]
do
echo -n letras[$numero]
let numero++
done


16. copy and paste

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 10/04/2009 - 00:06h

se ficou confuso no comentario anterior segue o copy/paste

-------------------- recorte na linha seguinte daqui -----------------
#!/bin/bash

function letras() {

# Vamos criar uma variavel com o conteudo anterior e outra variavel com um total de recursividade que
# queremos que sera diminuido de acordo com a chamada da propria funcao
local ANTERIOR=$1
local TOTAL=$2
local TOTAL=`expr $TOTAL - 1`

# Depois processamos todas as letras de A ate Z
for LETRA in {A..Z}
do

# Aqui mostramos a combinacao
echo "$ANTERIOR $LETRA"

if [ $TOTAL -ne 0 ]; then
# E aqui a chamada da recursividade
letras "$ANTERIOR $LETRA" $TOTAL
fi

done;
}

# Aqui chamamos a propria funcao com a quantidade de vezes que queremos processar baseado em um parametro
letras "" $1

------------------ Termina na linha antes desta ---------

Salve como letras.sh e simplesmente chame passando a quantidade como parâmetro!



17. Re: script quase impossivel de se fazer [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 10/04/2009 - 00:53h

xD

muito bom, agr soh falta eu entender oq tudo isso faz

heeheh

vou estudar um pouco o seu script

infelizmente o script que vc mandou copiar e colar deu errado =/

=========================

[douglas@localhost SH]$ sh letras.sh
expr: erro de sintaxe
A
letras.sh: line 18: [: -ne: unary operator expected
B
letras.sh: line 18: [: -ne: unary operator expected
C
letras.sh: line 18: [: -ne: unary operator expected
D
letras.sh: line 18: [: -ne: unary operator expected
E
letras.sh: line 18: [: -ne: unary operator expected
F
letras.sh: line 18: [: -ne: unary operator expected
G
letras.sh: line 18: [: -ne: unary operator expected
H
letras.sh: line 18: [: -ne: unary operator expected
I
letras.sh: line 18: [: -ne: unary operator expected
J
letras.sh: line 18: [: -ne: unary operator expected
K
letras.sh: line 18: [: -ne: unary operator expected
L
letras.sh: line 18: [: -ne: unary operator expected
M
letras.sh: line 18: [: -ne: unary operator expected
N
letras.sh: line 18: [: -ne: unary operator expected
O
letras.sh: line 18: [: -ne: unary operator expected
P
letras.sh: line 18: [: -ne: unary operator expected
Q
letras.sh: line 18: [: -ne: unary operator expected
R
letras.sh: line 18: [: -ne: unary operator expected
S
letras.sh: line 18: [: -ne: unary operator expected
T
letras.sh: line 18: [: -ne: unary operator expected
U
letras.sh: line 18: [: -ne: unary operator expected
V
letras.sh: line 18: [: -ne: unary operator expected
W
letras.sh: line 18: [: -ne: unary operator expected
X
letras.sh: line 18: [: -ne: unary operator expected
Y
letras.sh: line 18: [: -ne: unary operator expected
Z
letras.sh: line 18: [: -ne: unary operator expected

======================================================


18. ops, erro no meu codigo.

M4iir1c10
m4iir1c10

(usa Arch Linux)

Enviado em 10/04/2009 - 09:55h

Desculpe quando eu postei o script estava no trabalho usando o windows e nao testei o codigo, porem ao usar o meu Linux percebi que me faltou um ${} no meu codigo, entao aqui esta ele novamente, versao 2.0 :)

#!/bin/bash
# decare os valores do array letras
letras[0]=A
letras[1]=B
letras[2]=C
letras[3]=D
letras[4]=E
letras[5]=F
letras[6]=G
letras[7]=H
letras[8]=I
letras[9]=J
letras[10]=L
letras[11]=M
letras[12]=N
letras[13]=O
letras[14]=P
letras[15]=Q
letras[16]=R
letras[17]=S
letras[18]=T
letras[19]=U
letras[20]=Y
letras[21]=V
letras[22]=X
letras[23]=Z

#defina uma variavel para acompanhar o acrescimo do array letras, vamos chamar de numeros
numero=0

#crie um loop com o while ate o ultimo valor da array nesse caso 23
while [ $numero -le 23 ]
do
echo -n -e "${letras[$numero]}\n";
let numero++
done

# no loop do while, para colocar todos em uma unica linha remova o -e e o \n do comando echo.

Espero que seja isso que voce esta querendo fazer, caso contrario responda oque exatamente o script vai fazer e damos algumas ideias... ;)

OBS: -Stremer o seu codigo e muito bacana, coisa de geek, gostei mesmo... Douglas o codigo que era para copiar e colar funciona com um parametro que voce deve repassar, por exemplo:

./letras.sh 1 vai fazer as letras aparecerem uma vez.
./letras.sh 4 vai fazer as letras aparecerem 4 vezes sendo que para cada A todo o alfabeto sera listado, depois passa para o B e assim sucessivamente, por isso no penultimo comentario o stremer falou sobre quebrar senhas com forca bruta apartir da ideia desse script.


19. ae

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 10/04/2009 - 12:26h

é douglas, faltou passar a quantidade de letras como parâmetro.
Uma mudança que poderia ser feita é para não repetir as mesmas letras, verificando se a letra ja foi processada, ou seja, só mostraria as combinações diferentes sem repetição.

--- corte aki ---
#!/bin/bash

function letras() {

# Vamos criar uma variavel com o conteudo anterior e outra variavel com um total de recursividade que
# queremos que sera diminuido de acordo com a chamada da propria funcao
local ANTERIOR=$1
local TOTAL=$2
local TOTAL=`expr $TOTAL - 1`

# Depois processamos todas as letras de A ate Z
local LETRA=""
for LETRA in {A..Z}
do

local expressao="[.$ANTERIOR]"
local ver=`echo $LETRA | sed "s/\($expressao\)//"`

local proc=1
if [ -z ${ver} ]; then
proc=0
fi

if [ $proc -eq 1 ]; then

# Aqui mostramos a combinacao
echo "$ANTERIOR$LETRA"

if [ $TOTAL -ne 0 ]; then
# E aqui a chamada da recursividade
letras "$ANTERIOR$LETRA" $TOTAL
fi

fi
done;
}

# Aqui chamamos a propria funcao com a quantidade de vezes que queremos processar baseado em um parametro
letras "" $1

--- Fim corte ---

O problema que eu não manjo mto de shell e precisei usar o sed para verificar se determinado caracter ja foi processado (poderia usar o awk tbem)... não sei se tem alguma verificação... tipo for in e for not in...
O problema de usar o sed é que o programa fica meio lento....

Para fazer isso em C é bem simples e o resultado será bem mais rapido!!!



20. então

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 10/04/2009 - 13:09h

como é feriado, tomei um banho e revolvi fazer o prog em c pra te mostrar (pois lembrei quando eu comecei a programar como estes exemplinhos eram importanteS).

Segue então o prog em c.

---- corte aki... letras.c ----
#include <stdlib.h>
#include "stdio.h"
#include "string.h"

void letras(char * anterior, int total) {

char * anteriorInt = (char *) malloc(sizeof(char) * 30);
char * anteriorRep = (char *) malloc(sizeof(char) * 30);
strcpy(anteriorInt, anterior);
int totalInt = total;
totalInt -= 1;

int x = 0;
for (x=65; x<=90; x++) {
char * pos = strchr(anteriorInt, (char) x);
if (!(pos > 0)) {
printf("%s%c\n", anteriorInt, (char)x);
if (totalInt > 0) {
sprintf(anteriorRep, "%s%c", anteriorInt, x);
letras(anteriorRep, totalInt);
}
}

}
if (anteriorInt != NULL) {
free(anteriorInt);
}
if (anteriorRep != NULL) {
free(anteriorRep);
}

}

int main(int argc, char * argv[]) {

if (argc < 2) {
printf("Erro");
return 1;
}
int proc = atoi(argv[1]);

char * anterior = (char *) malloc(sizeof(char) * 30);
strcpy(anterior, "");
letras(anterior, proc);
if (anterior != NULL) {
free(anterior);
}

return 0;

}
--- fim do corte!

Seguinte... para compilar
# gcc letras.c -o letras

Para rodar:
# chmod +x letras
# ./letras 1
ou
# ./letras 2

e assim por diante...

como falei, neste caso ele não repete as mesmas letras, somente mostra as combinações diferentes e a velocidade é muito maior que o shell...
Você pode modificar um pouquinho este prog em c e mostrar todas as combinações..

faça os testes...

Boa sorte!

Qualquer duvida pergunte!


21. Re: script quase impossivel de se fazer [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 10/04/2009 - 13:10h

Obrigado, stremer e douglas, pq eu sei um apenas o básico d shell script e vcs já mataram a pau com os seus conceitos. Espero aprender mais tb para ajudar outras pessoas. Com relação ao q eu tava falando, nem precisava da variável n=0, pois o próprio echo faria a impressão das letras d A a Z, dessa forma:

echo -n "\nLetra "{A..Z} >> letras_de_A_a_Z.txt

Outra coisa: não há a necessidade, tb, d colocá-la em um laço (while) e nem em condição (if). O próprio echo daria conta do recado.

Espero t ajudado...


22. Re: script quase impossivel de se fazer [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 10/04/2009 - 13:15h

mauricio: o seu script ta bom, mas nao consegui fazer todas as combinaçoes possiveis, quero ateh 6 caracteres

stemer: o erro ainda persiste
letras.sh: line 29: [: -ne: unary operator expected
esse script ta muito dificil

meu irmao falou que seria bom se fizesse matriz

eu nao entendo praticamente nada de programação

linguagem C e C++ eu to lendo ainda umas apostilas e livros, nao sei nada ainda

=================================================

meu objetivo eh salvar em um arquivo

igual oq tinha feito com o de numeros

=================================================

#!/bin/bash

clear #limpar tudo que tem no terminal

echo "Todas as combinaçoes numéricas possíveis de 0 á 999999!!" #exibiçao no topo do programa
echo
echo
echo

if [ -e combinações-numéricas.txt ]

then

cat > 0 combinações-numéricas.txt

else

touch combinações-numéricas.txt

fi

n=0

while [ $n -le 999999 ]
do
echo "$n" >> combinações-numéricas.txt
n=`expr $n + 1`
done

================================================

tem como criar matriz em shell script??

vlw


23. ae

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 10/04/2009 - 13:23h

douglas...
ta dando erro pq você ta esquencendo do parâmetro.
execute assim:
# sh letras.sh 3

E veja todas as combinações das 3 letras...

Neste caso matriz não é o melhor a se fazer, visto que o SHELL pode iterar diversos valores {A..Z}. Em C eu fui mais a fundo (para ficar mais rapido) e resolvi trabalhar com os numeros ASC referentes as letras...

Para gravar no arquivo é simples, basta colocar o > e >> na hora da impressão dos valores ou ainda no próprio shell ao executar, ja que tudo ta indo para saida padrão.



24. sobre matriz em shell script

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 10/04/2009 - 13:31h

ja que não entende quase nada de programação é legal começar pelos conceitos basicos de matriz....

Achei um otimo artigo no VOL!

http://www.vivaolinux.com.br/dica/Utilizando-arrays-em-shell-script/







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts