Dicas para estudo (Shell Script)

13. Re: Dicas para estudo (Shell Script)

Antonio jose
antoniojose12

(usa Fedora)

Enviado em 05/09/2017 - 18:59h

MSOLIVER
fiz o script porem nao consegui obter sucesso para excluir usuario,eu identifiquei que quando tem por exemplo 5 usuarios com o mesmo nome o sed retorna os nomes mas não exclui, eu fiquei nesa parte e nao consegui proceguir,de resto esta funcionado
está legal o script? eu fiz como minha cabeça mandou consultando meu manual que tenho

#!/bin/sh



#VÁRIAVEIS
bancodedados="/home/$USER/bancodedados.txt"
temporario="/tmp/temporario.txt"


menu() {

echo "########################################"
echo "########### BUSCADOR de CONTATOS ##########"
echo "### ###"
echo "### [1] CADASTRO [3] EXCLUI ###"
echo "### [2] BUSCA [4] EXIT ###"
echo "### ###"
echo "############################################"
echo "########################################"
read opcao


case $opcao in

1) cadastro ;;
2) busca ;;
3) exclui ;;
4) echo -e "saindo...\n" exit ;;
*) invalido ;;

esac
}


cadastro() {

echo "Nome do usuário:"
read nome

echo "E-mail:"
read email

echo "Telefone fixo, com DDD:"
read telefonefixo

echo "Celular, com DDD:"
read celular

echo "$nome:$email:$telefonefixo:$celular" >> $bancodedados

menu
}


busca() {

echo "Digite o nome do usuário para pesquisa"
read pesquisausuario

if grep --color "$pesquisausuario" $bancodedados >> $temporario ; then
echo -e "Mostrando dados de $pesquisausuario\n"
echo
cat $temporario
rm $temporario
else
echo "Usuario não existe"
fi
menu
}


exclui() {

echo "Digite o nome do usuário para excluir"
read excluiusuario

echo
cat $bancodedados | grep $excluiusuario
echo

sed -i '/$excluiusuario/d' $bancodedados



menu
}




invalido(){
echo
echo "Está opção é inválida"
echo
menu
}

menu



  


14. Re: Dicas para estudo (Shell Script)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/09/2017 - 21:12h

antoniojose12 escreveu:

MSOLIVER
fiz o script porem nao consegui obter sucesso para excluir usuario,eu identifiquei que quando tem por exemplo 5 usuarios com o mesmo nome o sed retorna os nomes mas não exclui, eu fiquei nesa parte e nao consegui proceguir,de resto esta funcionado
está legal o script? eu fiz como minha cabeça mandou consultando meu manual que tenho

#!/bin/sh



#VÁRIAVEIS
bancodedados="/home/$USER/bancodedados.txt"
temporario="/tmp/temporario.txt"


menu() {

echo "########################################"
echo "########### BUSCADOR de CONTATOS ##########"
echo "### ###"
echo "### [1] CADASTRO [3] EXCLUI ###"
echo "### [2] BUSCA [4] EXIT ###"
echo "### ###"
echo "############################################"
echo "########################################"
read opcao


case $opcao in

1) cadastro ;;
2) busca ;;
3) exclui ;;
4) echo -e "saindo...\n" exit ;;
*) invalido ;;

esac
}


cadastro() {

echo "Nome do usuário:"
read nome

echo "E-mail:"
read email

echo "Telefone fixo, com DDD:"
read telefonefixo

echo "Celular, com DDD:"
read celular

echo "$nome:$email:$telefonefixo:$celular" >> $bancodedados

menu
}


busca() {

echo "Digite o nome do usuário para pesquisa"
read pesquisausuario

if grep --color "$pesquisausuario" $bancodedados >> $temporario ; then
echo -e "Mostrando dados de $pesquisausuario\n"
echo
cat $temporario
rm $temporario
else
echo "Usuario não existe"
fi
menu
}


exclui() {

echo "Digite o nome do usuário para excluir"
read excluiusuario

echo
cat $bancodedados | grep $excluiusuario
echo

sed -i '/$excluiusuario/d' $bancodedados
menu
}




invalido(){
echo
echo "Está opção é inválida"
echo
menu
}

menu


Antonio,
Testei a AGENDA . . . . A lógica esta legal, bem simples, mas funcional . . .
Pode dar uma melhorada . . . . Tipo:
Formatar a saída da pesquisa, Exemplo:
Nome : Fulano de Tal
Email: fulano@gmail.com
Cel: 11123456789

No cadastro, é possível fazer um laço, para evitar a repetição de comandos . . . . .
Centralizar o MENU e ate COLORIR.....
Segue uma DICA para solucionar o problema da exclusão quando existem nomes iguais.
Utilize um "ID" para cada registro, tipo:
0001:NOME:EMAIL:TEL1:TEL2
O restante da lógica vc desenvolve . . . . rsrsrsrs


mso



15. Re: Dicas para estudo (Shell Script)

Antonio jose
antoniojose12

(usa Fedora)

Enviado em 05/09/2017 - 21:39h

Obrigado pelas dicas!
eu fiz assim a parte do cadastro para formar somente uma string com novas linhas com \n e adicionei um numero aleatorio,porem estava pensando que se caso fosse usavel seria ruim quando chegasse a um numero grande de usuarios,talvez poderia repetir segue:

echo -e "\nNúmero de Cadastro: $RANDOM\nNome:$nome\nEmail:$email\nTelefone:$telefone\nCelular: $celular\n\n" >> $bancodedados

por isso acho que na hora do cadastro vou pedir talvez para o usuario adicionar um numero de cadastro talvelz?


16. Re: Dicas para estudo (Shell Script)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/09/2017 - 22:14h

antoniojose12 escreveu:

Obrigado pelas dicas!
eu fiz assim a parte do cadastro para formar somente uma string com novas linhas com \n e adicionei um numero aleatorio,porem estava pensando que se caso fosse usavel seria ruim quando chegasse a um numero grande de usuarios,talvez poderia repetir segue:

echo -e "\nNúmero de Cadastro: $RANDOM\nNome:$nome\nEmail:$email\nTelefone:$telefone\nCelular: $celular\n\n" >> $bancodedados

por isso acho que na hora do cadastro vou pedir talvez para o usuario adicionar um numero de cadastro talvelz?


Antonio, não use um ID ALEATÓRIO, use Nº SEQUENCIAL
Quando for CADASTRAR um usuário, "pegue" o Nº de registros do "bancodedados.txt" e acrescente 1.
Ex:
ID=$(($(wc -l < bancodedados.txt)+1))
Ou
ID=$(awk 'END {printf "%05d" ,NR+1}' bancodedados.txt)


Antonio ESCREVEU:
echo -e "\nNúmero de Cadastro: $RANDOM\nNome:$nome\nEmail:$email\nTelefone:$telefone\nCelular: $celular\n\n" >> $bancodedados

A sugestão é para "VERTICALIZAR" a saída da pesquisa, e não o banco de dados....

MSO


17. Re: Dicas para estudo (Shell Script)

Antonio jose
antoniojose12

(usa Fedora)

Enviado em 06/09/2017 - 03:02h

msoliver
não consegui fazer o laço com o for,podes passar um caminho detalhado? nao achei nada de informação na internte com o read


18. Re: Dicas para estudo (Shell Script)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 06/09/2017 - 13:57h

antoniojose12 escreveu:

msoliver
não consegui fazer o laço com o for,podes passar um caminho detalhado?
nao achei nada de informação na internte com o read


Antonio, nem tudo encontramos na Internet . . .
Nesse caso, procuramos na nossa "mente" . . . .

for CAMPOS in Nome TelFixo TelCel  Email; do 
read -p "${CAMPOS}: " ${CAMPOS}
done
ID=$(awk 'END {printf "%05d" ,NR+1}' bancodedados.txt)
echo "$ID:$Nome:$TelFixo:$TelCel:$Email" >> bancodedados.txt


Poderia ser feito com uma ARRAY . . .
CAMPOS=(Nome TelFixo TelCel Email)
.
.
.
Att:
MSO


19. Re: Dicas para estudo (Shell Script)

Antonio jose
antoniojose12

(usa Fedora)

Enviado em 07/09/2017 - 01:13h

oi eu não cheguei a utilizar ainda este codigo pelos motivos de aprendizagem ja que estava ainda na aprendizagem do for com numero essas besteras,por isso antes de usar estou tirando a duvida

vamos ver se entendi a logica:

for CAMPOS in Nome TelFixo TelCel Email; do
read -p "${CAMPOS}: " ${CAMPOS}
done

entao voce fez a "variavel campos com 4 nomes" com o for. no read ele puxou a variavel campos com aqueles quatro nomes,no caso vai ser a saida na tela, e finalizando o read na variavel do mesmo o $campos puxou os 4 nomes de cima (nome tel etc.) (obs,nao sabia que era possivel isto! 4 variaveis no read)
seria isso?


ID=$(awk 'END {printf "%05d" ,NR+1}' bancodedados.txt)
echo "$ID:$Nome:$TelFixo:$TelCel:$Email" >> bancodedados.txt

Eu entendi por cima, criou uma variavel chamado ID, ai ja me complicou rs,eu nao aprendi awk e printf
no echo blz, ele puxou a variavel do read com os quatros nomes e deu a saida para o banco de dados


20. Re: Dicas para estudo (Shell Script)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/09/2017 - 13:41h

antoniojose12 escreveu:

oi eu não cheguei a utilizar ainda este codigo pelos motivos de aprendizagem ja que estava ainda na aprendizagem do for com numero essas besteras,por isso antes de usar estou tirando a duvida

vamos ver se entendi a logica:

for CAMPOS in Nome TelFixo TelCel Email; do
read -p "${CAMPOS}: " ${CAMPOS}
done

entao voce fez a "variavel campos com 4 nomes" com o for. no read ele puxou a variavel campos com aqueles quatro nomes,no caso vai ser a saida na tela, e finalizando o read na variavel do mesmo o $campos puxou os 4 nomes de cima (nome tel etc.) (obs,nao sabia que era possivel isto! 4 variaveis no read)
seria isso?


ID=$(awk 'END {printf "%05d" ,NR+1}' bancodedados.txt)
echo "$ID:$Nome:$TelFixo:$TelCel:$Email" >> bancodedados.txt

Eu entendi por cima, criou uma variavel chamado ID, ai ja me complicou rs,eu nao aprendi awk e printf
no echo blz, ele puxou a variavel do read com os quatros nomes e deu a saida para o banco de dados


Antonio, boa tarde.
É mais ou menos isso....
O "LAÇO for", pega UM CAMPO POR VEZ.
Execute o comando abaixo:
for CAMPO in Nome TelFixo TelCel Email; do sleep 1;echo "$(date):$CAMPO"; done 

Qui Set 7 13:25:12 BRT 2017:Nome
Qui Set 7 13:25:13 BRT 2017:TelFixo
Qui Set 7 13:25:14 BRT 2017:TelCel
Qui Set 7 13:25:15 BRT 2017:Email

O "READ", pega cada campo e mostra na tela para que sejam fornecidas as informações.

Antonio disse:
obs,nao sabia que era possível isto! 4 variáveis no read

Sim, é possível, mas não utilizei dessa forma.....

Quanto ao awk, esse comando é bem simples.....
ID=$(awk 'END {printf "%05d" ,NR+1}' bancodedados.txt)
Ele conta a quantidade de registros (NR) e soma 1,
O printf, com a sintaxe utilizada,
Dá o resultado com 5 DÍGITOS.
O awk, pode ser substituído pelo "wc -l" . . .

MSO



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts