Exercicio em Shell, Duvida com grep e function

1. Exercicio em Shell, Duvida com grep e function

Rafael Freire
rfreir

(usa Outra)

Enviado em 04/12/2012 - 16:08h

Boa Tarde Galera,

Estou aqui para pedir ajuda, estou desenvolvendo um batalha naval em shell script para uma matéria da faculdade, o jogo já funciona, claro que com alguns bugs e muitas redundâncias, por eu não ter aulas de programação... E mesmo o professor da outra turma em programação não consegue me ajudar com a duvida pois alega não conhecer shell script...

Irei postar abaixo meu script e gostaria que dessem uma olhada, mas o ponto crucial deste tópico é, como usaria o grep em uma função para caso ela seja falsa continue o script, se verdadeira para e solicitar nova jogada...

O script está todo comentado para meu melhor uso e facilitar a visualização do professor.

Podem me ajudar com as funções??
#Cria Função de teste e comparação

#function Compare {

# if [[ `cat jogadas.txt | grep "$lin $coluna"` == 0 ]]
#then#

# return
#fi
#}

#function Joguenov {
# if [[ Compare -ne 0 ]]
#then
# echo -e "Jogue Novamente"
# echo
# read -p "Vamos explodir em qual linha? Ex: A. " lin
# read -p "Vamos explodir em qual coluna? Ex: 3. " coluna
#
#fi
#}


abaixo está o script completo


#!/bin/bash
# AUTORES:(Giovanna, Staphanie, Rafael)
# DATA: 2012-10-09

# DESCRIÇÃO:
# Script inicial para o trabalho de Shell Script


# CHANGELOG:
# Ano-Mês-Dia (autor) - descrição da alteração
# 2012-10-09 (Giovanna, Stephanie, Rafael) - V0
# 2012-10-16 (Giovanna, Stephanie, Rafael) - V1
# 2012-10-30 (Giovanna, Stephanie, Rafael) - v2 - Adicionado o desenho do mapa, desenho da caveira e a música.
# 2012-11-27 (Giovanna, Stephanie, Rafael) - v3 - Adicionado o barcos verticais, editado o mapa, adicionado mensagem inicial, removido a caveira e a música.
#2012-12-04 ((Giovanna, Stephanie, Rafael) - v4 - corrigidos bug de posicionamento dos barcos, adicionado explicação dos barcos.

#Limpa a tela
clear
touch jogadas.txt


#Cria Função de teste e comparação

#function Compare {

# if [[ `cat jogadas.txt | grep "$lin $coluna"` == 0 ]]
#then#

# return
#fi
#}

#function Joguenov {
# if [[ Compare -ne 0 ]]
#then
# echo -e "Jogue Novamente"
# echo
# read -p "Vamos explodir em qual linha? Ex: A. " lin
# read -p "Vamos explodir em qual coluna? Ex: 3. " coluna
#
#fi
#}
# Exibe a introdução
echo -e "Bem Vindo ao Global Naval Battle"
echo
echo -e "Este jogo de Batalha Naval tem como objetivo te vencer"
echo
echo -e "O mapa da esquerda é o qual você irá tentar acertar a máquina, enquanto o da direita será o que a máquina acertará você"
echo
echo -e "Existem 3 tipos de barcos, Canoa(CN), Submarinos(SM) e Porta-aviões (PA)"
echo -e "O tamnho deles são respectivamente 2, 3 e 4 espaços."
echo
echo -e "Boa Sorte"
echo
echo
read -p "Para começar a jogar pressione enter"
clear
#Define o valor para a pontuação dos barcos

barco=0
barco2=0

#Define o mapa como linhas
linha[0]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[1]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[2]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[3]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[4]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[5]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[6]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[7]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[8]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha[9]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"


# Randomiza a posição dos barquinhos no mapa.

canoav="$((RANDOM % 10)) $((RANDOM % 9))"
submarinov="$((RANDOM % 9)) $((RANDOM % 10))"
portaaviaov="$((RANDOM % 9)) $((RANDOM % 10))"
canoa="$((RANDOM % 10)) $((RANDOM % 9))"
submarino="$((RANDOM % 10)) $((RANDOM % 9))"
portaaviao="$((RANDOM % 10)) $((RANDOM % 9))"

# Compara as posições dos barcos para ver se vao bater entre si.
if [[ $canoa == $canoav || $canoa == $submarino || $canoa == $porataaviao || $canoa == $submarinov || $canoa == $portaaviaov || $canoav == $portaaviaov || $canoav == $submarinov || $canoav == $submarino || $canoav == $portaaviao || $submarino == $submarinov || $submarino == $portaaviao || $submarino == $portaaviaov || $submarinov == $portaaviao || $submarinov == $portaaviaov || $portaaviao == $portaaviaov ]]

# se forem, remove alguns barcos e randomiza novamente
then

canoav="0"
submarino="0"
portaaviaov="0"
canoa="$((RANDOM % 10)) $((RANDOM % 9))"
submarinov="$((RANDOM % 10)) $((RANDOM % 9))"
portaaviao="$((RANDOM % 10)) $((RANDOM % 9))"

fi

# exporta a posição dos barcos para o arquivo posi
echo $canoav >> posi.txt
echo $submarinov >> posi.txt
echo $portaaviaov >> posi.txt
echo $canoa >> posi.txt
echo $submarino >> posi.txt
echo $portaaviao >> posi.txt




# Exibe o mapa 2
linha2[0]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[1]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[2]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[3]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[4]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[5]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[6]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[7]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[8]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"
linha2[9]="◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙ ◙◙"


# Randomiza a posição dos barquinhos no mapa 2.
submarino2="$((RANDOM % 10)) $((RANDOM % 9))"
canoa2="$((RANDOM % 10)) $((RANDOM % 9))"
portaaviao2="$((RANDOM % 10)) $((RANDOM % 9))"
submarino2v="$((RANDOM % 9)) $((RANDOM % 10))"
canoa2v="$((RANDOM % 9)) $((RANDOM % 10))"
poratavia2v="$((RANDOM % 9)) $((RANDOM % 10))"


# Compara as posições dos barcos para ver se vao bater entre si.
if [[ $canoa2 == $canoa2v || $canoa2 == $submarino2 || $canoa2 == $porataaviao2 || $canoa2 == $submarino2v || $canoa2 == $portaaviao2v || $canoa2v == $portaaviao2v || $canoa2v == $submarino2v || $canoa2v == $submarino2 || $canoa2v == $portaaviao2 || $submarino2 == $submarino2v || $submarino2 == $portaaviao2 || $submarino2 == $portaaviao2v || $submarino2v == $portaaviao2 || $submarino2v == $portaaviao2v || $portaaviao2 == $portaaviao2v ]]

# se forem, remove alguns barcos e randomiza novamente
then

canoa2v=0
submarino2v=0
portaaviao2v=0
submarino2="$((RANDOM % 10)) $((RANDOM % 9))"
canoa2="$((RANDOM % 10)) $((RANDOM % 9))"
portaaviao2="$((RANDOM % 10)) $((RANDOM % 9))"

fi


# Utilizado para criar um loop do programa, onde para cada jogada realizada retorna o mapa na tela e solicita mais uma jogada
for ((x=1;x>=1;x++));
do

# Exibe o mapa
echo
echo
echo

echo " 0 1 2 3 4 5 6 7 8 9"" "" 0 1 2 3 4 5 6 7 8 9"
echo
echo "A ${linha[0]}"" ""A ${linha2[0]}"
echo
echo "B ${linha[1]}"" ""B ${linha2[1]}"
echo
echo "C ${linha[2]}"" ""C ${linha2[2]}"
echo
echo "D ${linha[3]}"" ""D ${linha2[3]}"
echo
echo "E ${linha[4]}"" ""E ${linha2[4]}"
echo
echo "F ${linha[5]}"" ""F ${linha2[5]}"
echo
echo "G ${linha[6]}"" ""G ${linha2[6]}"
echo
echo "H ${linha[7]}"" ""H ${linha2[7]}"
echo
echo "I ${linha[8]}"" ""I ${linha2[8]}"
echo
echo "J ${linha[9]}"" ""J ${linha2[9]}"


# Pergunta onde será a próxima jogada e define as variáveis "lin e coluna"
echo
echo

read -p "Vamos explodir em qual linha? Ex: A. " lin
read -p "Vamos explodir em qual coluna? Ex: 3. " coluna

#Compare
#Joguenov
#echo $lin $coluna >> jogadas.txt

# Tranforma linha tanto maiúscula quanto minúscula na variavel lin e desenha a posição indicada no mapa
case "$lin" in
[Aa]) lin=0;;
[Bb]) lin=1;;
[Cc]) lin=2;;
[Dd]) lin=3;;
[Ee]) lin=4;;
[Ff]) lin=5;;
[Gg]) lin=6;;
[Hh]) lin=7;;
[Ii]) lin=8;;
[Jj]) lin=9;;
esac

case "$lino" in
[Aa]) lino=0;;
[Bb]) lino=1;;
[Cc]) lino=2;;
[Dd]) lino=3;;
[Ee]) lino=4;;
[Ff]) lino=5;;
[Gg]) lino=6;;
[Hh]) lino=7;;
[Ii]) lino=8;;
[Jj]) lino=9;;
esac

# Verifica se o submarino é igual a linha e coluna indicada pelo usuário.
if [[ "${lin} ${coluna}" = "$submarinov" || "$(($lin-1)) ${coluna}" = "$submarinov" || "$(($lin-2)) ${coluna}" = "$submarinov" ]]


#Então é soma mais 1 a variável submarino, e muda no local indicado para R
then
let barco++

mudar='SM'

# Verifica se o canoa é igual a linha e coluna indicada pelo usuário.
elif [[ "${lin} ${coluna}" = "$canoav" || "$(($lin-1)) ${coluna}" = "$canoav" ]]


#Então é soma mais 1 a variável canoa, e muda no local indicado para G
then
let barco++
mudar='CN'

# Verifica se o porta avião é igual a linha e coluna indicada pelo usuário.
elif [[ "${lin} ${coluna}" = "$portaaviaov" || "$(($lin-1)) ${coluna}" = "$portaaviaov" || "$(($lin-2)) ${coluna}" = "$portaaviaov" || "$(($lin-3)) ${coluna}" = "$portaaviaov" ]]


#Então é soma mais 1 a variável porta avião, e muda no local indicado para S
then
let barco++
mudar='PA'

# Verifica se o porta avião é igual a linha e coluna indicada pelo usuário.
elif [[ "${lin} ${coluna}" = "$portaaviao" || "${lin} $(($coluna-1))" = "$portaaviao" || "${lin} $(($coluna-2))" = "$portaaviao" || "${lin} $(($coluna-3))" = "$portaaviao" ]]


#Então é soma mais 1 a variável porta avião, e muda no local indicado para S
then
let barco++
mudar='PA'

# Verifica se o porta avião é igual a linha e coluna indicada pelo usuário.
elif [[ "${lin} ${coluna}" = "$submarino" || "${lin} $(($coluna-1))" = "$submarino" || "${lin} $(($coluna-2))" = "$submarino" ]]


#Então é soma mais 1 a variável barco, e muda no local indicado para S
then
let barco++
mudar='SM'


# Verifica se o canoa é igual a linha e coluna indicada pelo usuário.
elif [[ "${lin} ${coluna}" = "$canoa" || "${lin} $(($coluna-1))" = "$canoa" ]]


#Então é soma mais 1 a variável barco, e muda no local indicado para CN
then
let barco++
mudar='CN'

else

mudar='≈≈'

fi

# Redesenha o Mapa alterando apenas o local que foi jogado
linha[$lin]=${linha[$lin]:0:$(($coluna*4))}${mudar}${linha[$lin]:$(((coluna*4+1)+1))}


#faz com que a máquina jogue em uma posição aleatória
lino="$((RANDOM % 10))"
coluno="$((RANDOM % 10))"

# Exibe a mensagem da jogada do oponente.
echo "Vou te explodir na linha! " lino $lino
sleep 1
echo "Vou te explodir na coluna. " coluno $coluno
sleep 1

#if [[$lino || $coluno]]

# Verifica se o submarino2 é igual a linha e coluna indicada pelo usuário.
if [[ "${lino} ${coluno}" = "$submarino2" || "${lino} $(($coluno-1))" = "$submarino2" ]]


#Então é soma mais 1 a variável submarino2, e muda no local indicado para R
then
let barco2++
mudar='MM'

# Verifica se o canoa2 é igual a linha e coluna indicada pelo usuário.
elif [[ "${lino} ${coluno}" = "$canoa2" || "${lino} $(($coluno-1))" = "$canoa2" ]]


#Então é soma mais 1 a variável canoa2, e muda no local indicado para G
then
let barco2++
mudar='QQ'

# Verifica se o porta avião2 é igual a linha e coluna indicada pelo usuário.
elif [[ "${lino} ${coluno}" = "$portaaviao2" || "${lino} $(($coluno-1))" = "$portaaviao2" ]]


#Então é soma mais 1 a variável porta avião2, e muda no local indicado para S
then
let barco2++
mudar='PP'

# Caso não for submarino, canoa, porta avião, mudar lugar indicado para ≈ que significa água
else
mudar='≈≈'

fi



#Primeiramente seleciona qual linha será alterada;
#Depois imprime as posiçoes que não foram alteradas pelo usuario, pausando na coluna selecionada. O *2 mutiplica a coluna digita por 2 pois
#há um espaço no mapa desenhado, o "+1" um indica que quando mudar o item na coluna deve voltar a imprir o mapa zerado.

linha2[$lino]=${linha2[$lino]:0:$(($coluno*4))}${mudar}${linha2[$lino]:$(((coluno*4+1)+1))}

# Se acertar submarino, canoa e porta avião

if [[ $submarino -eq 0 && $barco -eq 9 ]]


# Mostra a frase que venceu o jogo e em quantas tentativas o jogo foi finalizado
then
echo -e "Você afundou os barcos!"
echo "Você Venceu na tentativa número: ${x}"
exit 0

elif [[ $barco -eq 18 ]]


# Mostra a frase que venceu o jogo e em quantas tentativas o jogo foi finalizado
then
echo -e "Você afundou os barcos!"
echo "Você Venceu na tentativa número: ${x}"
exit 0

fi

if [[ $canoa2v -eq 0 && $barco -eq 9 ]]


# Mostra a frase que venceu o jogo e em quantas tentativas o jogo foi finalizado
then
echo -e "Você afundou os barcos!"
echo "Você Venceu na tentativa número: ${x}"
exit 0

# Se A máquina acertar todos os barcos
elif [[ $barco2 -eq 18 ]]

#então
then

# Mostrar mensagem de que perdeu o jogo e em que tentativa foi finalizado
echo "Você se [*****]!"
echo "A máquina venceu na tentativa número: ${x}"


# Exibir caveira em vermelho
echo -e "\a\a\e[31;1m
¶¶¶¶¶¶¶¶¶¶¶¶¶¶
¶¶¶¶¶ ¶¶¶¶¶
¶¶¶ ¶¶¶
¶¶¶ ¶¶
¶¶ ¶¶
¶¶ ¶¶
¶¶ ¶¶
¶¶ ¶ ¶¶ ¶¶
¶ ¶¶ ¶¶ ¶
¶ ¶¶ ¶¶ ¶
¶¶ ¶¶ ¶ ¶
¶ ¶¶ ¶¶ ¶¶
¶¶ ¶ ¶¶¶¶ ¶¶¶¶ ¶¶ ¶¶
¶¶ ¶ ¶¶¶¶¶¶¶¶¶ ¶¶¶¶¶¶¶¶¶¶ ¶¶ ¶
¶¶¶ ¶¶¶¶¶¶¶¶¶¶ ¶¶¶¶¶¶¶¶¶¶ ¶¶¶
¶¶ ¶ ¶¶¶¶¶¶¶¶ ¶¶¶¶¶¶¶¶ ¶7 ¶¶
¶¶ ¶¶ ¶ ¶¶¶¶¶¶ ¶¶¶¶¶¶ ¶¶ ¶¶ ¶¶
¶ ¶¶ ¶ ¶¶ ¶¶ ¶ ¶¶ ¶
¶¶ ¶¶¶¶ ¶¶ ¶¶¶ ¶¶¶ ¶¶ ¶¶¶¶ ¶¶
¶¶ ¶¶¶¶¶¶¶ ¶¶¶ ¶¶¶ ¶¶¶¶¶¶¶ ¶¶
¶¶¶¶¶¶¶¶ ¶¶¶¶¶¶¶ ¶¶¶ ¶¶¶ ¶¶¶¶¶¶ ¶¶¶¶¶¶¶¶
¶¶¶¶¶ ¶ ¶ ¶ ¶¶¶ ¶ ¶¶¶¶¶
¶¶¶¶¶ ¶ ¶ ¶¶¶¶¶¶¶¶¶ ¶¶¶¶¶
¶¶ ¶ ¶ ¶ ¶ ¶ ¶ ¶ ¶¶
¶¶¶¶ ¶ ¶ ¶¶ ¶ ¶ ¶ ¶¶ ¶¶¶¶
¶¶¶¶ ¶ ¶¶¶¶ ¶ ¶¶¶¶ ¶ ¶¶¶¶
¶¶¶¶¶¶¶¶¶ ¶¶ ¶¶ ¶¶¶¶¶¶¶¶¶
¶¶ ¶¶¶¶¶¶¶ ¶¶¶ ¶¶¶ ¶¶
¶¶ ¶¶ ¶¶¶¶¶¶ ¶¶ ¶¶
¶ ¶¶ ¶¶ ¶¶
¶¶¶ ¶¶¶!\e[m"


exit 0


fi
clear
done
rm jogadas.txt
rm posi.txt



  


2. Re: Exercicio em Shell, Duvida com grep e function

Marcos Paulo Ferreira
daemonio

(usa Slackware)

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

Olá,

se o objetivo da função Compare é retornar true ou false, então você pode implementá-la diretamente usando o grep:

function Compare() {
return grep "$lin $coluna" jogadas.txt
}

Ele retorna 0 se encontrou a linha e não-zero caso contrário. Dependendo de onde você usa essa função, é melhor incluir a linha do grep diretamente, pois a função só tem uma linha.

Era isso o problema?

Abraços


3. Re: Exercicio em Shell, Duvida com grep e function

Rafael Freire
rfreir

(usa Outra)

Enviado em 06/12/2012 - 13:19h

O problema é quase esse, a function tem que retornar true ou false, mas eu tenho que colocar um if, para que caso seja zero, continue o script, caso seja true, solicite que jogue novamente!,

function Compare() {
return grep "$lin $coluna" jogadas.txt
}

if [ Compare false; ]
then

return
else

# echo -e "Jogue Novamente"
# echo
# read -p "Vamos explodir em qual linha? Ex: A. " lin
# read -p "Vamos explodir em qual coluna? Ex: 3. " coluna
#

fi
}



Seria assim que tem que ficar???




4. Re: Exercicio em Shell, Duvida com grep e function

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/12/2012 - 14:07h

Possivelmente ocê deveria trocar o if por while, já que quer que a pergunta fique sendo feita enquanto -- em Inglês, while -- certa condição se der.


5. Re: Exercicio em Shell, Duvida com grep e function

Rafael Freire
rfreir

(usa Outra)

Enviado em 06/12/2012 - 14:10h

certo, usarei o while mas a estrutura para retornar para o script está certa?


6. Re: Exercicio em Shell, Duvida com grep e function

Rafael Freire
rfreir

(usa Outra)

Enviado em 06/12/2012 - 15:06h

A função deveira ficar como abaixo???


function Compare() {

y1="`echo "$lin $coluna" jogadas.txt`"

response="$y1"

until [ "$response" -ne "a 1" ] ; do
echo -e "Jogue Novamente"
echo
read -p "Vamos explodir em qual linha? Ex: A. " lin
read -p "Vamos explodir em qual coluna? Ex: 3. " coluna


done
}






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts