Exercício de Shell

1. Exercício de Shell

Gabriel Ferrari
DidaFerrari

(usa Outra)

Enviado em 29/11/2012 - 10:43h

Bom dia, pessoal! Tudo bem com vocês? Então, estou com uma pequena dúvida em um script que fiz pra faculdade. O exercício pede que crie um script que leia um conjunto de números e indique o maior deles. Eu criei esse, mas não está funcionando. Ainda estou aprendendo e tenho um pouco de dificuldade com as sintaxes, então vocês podem me ajudar? Valeu, pessoal.

#!/bin/bash
VET=($@)
TAM=$((${#VET[@]}-1))
MAIOR=$VET[0]

for i in (seq 1 $TAM)
do
if [ $VET[$i] -gt $MAIOR ]
then
MAIOR=$VET[$i]
fi
done
echo "O maior número digitado foi: $MAIOR"



Já peço desculpas adiantas pelos possíveis erros, e mais uma vez, obrigado!


  


2. Re: Exercício de Shell

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/11/2012 - 15:00h

Esqueça vetores em exercícios desse tipo, a não ser que o enunciado explicitamente mande você fazer uso deles.

Pense comigo: antes de você ler qualquer número, não há maior nem menor. Ao ler o primeiro número, ele será automaticamente o maior lido até agora e o menor lido até agora. A cada novo número que você ler, você só terá de comaprar o que acabou de ler com aquele que era o maior/menor até então e, se for o caso, dizer que esse "maiormenor até agora" é o que acabou de ser lido. No final de lista de números, o maior/menor de todos é o que todos é o que era maior/menor até o momento em que se descobriu que se chegou ao im da lista.


3. Re: Exercício de Shell

Osama Jr.
/bin/laden

(usa Void Linux)

Enviado em 29/11/2012 - 15:25h

Exemplinho "meia-boca":

#!/bin/sh
#
numeros=$@
comparado=0

for i in $numeros; do
if [ $i -gt $comparado ]; then
maior=$i
fi
comparado=$maior
done

echo "O maior numero digitado foi: $maior"


Uso:

./comp_maior.sh 51 7 102 3128
O maior numero digitado foi: 3128




4. Re: Exercício de Shell

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/11/2012 - 15:52h

/bin/laden escreveu:

Exemplinho "meia-boca":

#!/bin/sh
#
numeros=$@
comparado=0

for i in $numeros; do
if [ $i -gt $comparado ]; then
maior=$i
fi
comparado=$i
done

echo "O maior numero digitado foi: $maior"


Uso:

./comp_maior.sh 51 7 102 3128
O maior numero digitado foi: 3128



Meia boca mesmo: está errado!

(Dica: rode com os argumentos "999 1 2", e veja qual valor ele mostra como maior.)


5. Re: Exercício de Shell

Osama Jr.
/bin/laden

(usa Void Linux)

Enviado em 29/11/2012 - 16:02h

#BSOD

Substitua:

comparado=$i

por

comparado=$maior


6. Re: Exercício de Shell

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/11/2012 - 16:38h

Você usa duas variáveis, e uma é sempre feita igual à outra. Para que, então, usar duas?

E seu programa continua errado. Se você passar uma lista de zeros ou valores negativos, ele vai imprimir um valor vazio.

A forma correta é ler o primeiro valor e fazê-lo o maior incondicionalmente (ou quase -- um bom script sabe lidar com o caso de a leitura falhar), e só depois começa o loop fazendo comparações. (Alternativamente, como o shell suporta o teste de variável indefinida -- que é diferente de definida mas com valor vazio! --, todas as leituras poderia estar dentro do loop, mas o teste também interno ao loop dependeria de duas condições, em lugar de apenas uma.)


7. Re: Exercício de Shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 30/11/2012 - 02:19h


#!/bin/bash
echo $@ |
sed -e 's/[^0-9 ]//g; s/ /\n/g' |
grep -v "^$" |
uniq |
sort -nr |
head -n 1



8. Re: Exercício de Shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 30/11/2012 - 02:58h

Funcionará corretamente apenas se os valores passados ao script forem numeros inteiros positivos.

#!/bin/bash
m=0
for i in $@
do
test $i -gt $m && m=$i
done

echo $m



BOA SORTE!!!


9. Re: Exercício de Shell

Osama Jr.
/bin/laden

(usa Void Linux)

Enviado em 30/11/2012 - 10:48h

paulo1205 escreveu:

Você usa duas variáveis, e uma é sempre feita igual à outra. Para que, então, usar duas?

E seu programa continua errado. Se você passar uma lista de zeros ou valores negativos, ele vai imprimir um valor vazio.

A forma correta é ler o primeiro valor e fazê-lo o maior incondicionalmente (ou quase -- um bom script sabe lidar com o caso de a leitura falhar), e só depois começa o loop fazendo comparações. (Alternativamente, como o shell suporta o teste de variável indefinida -- que é diferente de definida mas com valor vazio! --, todas as leituras poderia estar dentro do loop, mas o teste também interno ao loop dependeria de duas condições, em lugar de apenas uma.)


Como eu disse esse é um "exemplinho meia-boca" logo fiz ele bem básico e mais pro entendimento do cara que fez a pergunta (que por sinal é iniciante em shell script)! Portanto a medida que fossem surgindo as dúvidas dele aí sim poderíamos incrementar ainda mais o "exemplinho TOSCO e meia-boca" postado por mim!

;)


10. Re: Exercício de Shell

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/11/2012 - 11:43h

Não entendo a razão de vocês insistirem com essas soluções parciais, se é tão fácil fazer a coisa certa. Admitindo que os valores sejam todos passados por linha de comando (e desprezando a parte da postagem original que fala sobre ler valores), uma solução completa (a única coisa que ela não faz é verificar se os argumentos são realmente numéricos) seria a seguinte.

#!/bin/bash
if [[ $# -gt 0 ]]; then
max=$1
shift
while [[ $# -gt 0 ]]; do
[[ "$1" -gt "$max" ]] && max=$1
shift
done
echo "O maior valor entre os argumentos é $max."
else
echo "Por favor, especifique pelo menos um argumento numérico."
exit 1
fi



11. Re: Exercício de Shell

Osama Jr.
/bin/laden

(usa Void Linux)

Enviado em 30/11/2012 - 13:32h

Beleza!

O problema dos caras que já estão num nível "mais avançado" é o de achar que os iniciantes devem entender um código "mais complexo" logo de cara! De que adianta você "jogar" pra um cara que mal sabe o que é um loop e como ele funciona, que nem sabe direito o que são parâmetros posicionais, etc... ??? Desse jeito você só vai confundir ainda mais a cabeça do cidadão que tá engatinhando! Por isso sou adepto de códigos básicos, simples e "inteligíveis" para os iniciantes. Assim o cara vai entendo o funcionamento básico da coisa e com o decorrer do tempo (e prática) vai desenvolvendo suas habilidades e melhorando de nível!

Flw!




12. Re: Exercício de Shell

Perfil removido
removido

(usa Nenhuma)

Enviado em 30/11/2012 - 14:30h



#!/bin/bash
echo $@ |
sed -e 's/[^0-9 ]//g; s/ /\n/g' |
grep -v "^$" |
grep -v "^0" |
uniq |
sort -nr |
head -n 1
echo -en " é o maior valor da sequencia $@\n"


Objetivo: filtrar o maior valor de uma sequencia de numeros inteiros positivos.

Imprima todos os valores passdos por linha de comando.
Exclua tudo o que não for espaço e valor númerico em seguida substitua espaços pelo caractere não imprimível de nova linha.
Exclua as linhas em branco.
Exclua as linhas que comecem com 0 (zero).
Transforme as linha duplicadas em únicas.
Organize as linhas em ordem numerica decrescente.
Pegue a primeira linha, ou seja a de maior valor.

Como podem peceber vários comandos foram usados sob justificativa de que o questionador busque o que cada linha faz aumentando seus conhecimentos.

BOA SORTE!!!



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts