Ajuda com Shell Script....

1. Ajuda com Shell Script....

andre
truster0

(usa Outra)

Enviado em 13/11/2014 - 22:53h

Fala pessoal , Então não tenho muito conhecimento em shell e preciso fazer este exercicio abaixo.

Faça um script que verifique se um nome é um palíndromo. Uma palavra é um palíndromo se a sua leitura é a mesma da esquerda para a direita e vice versa. Dica: use um array para armazenar a palavra. Exemplo: ARARA, ANA, etc.

Me arrisquei e deu isso mas esta dando erro.

#!/bin/bash

echo "Digite a palavra a ser testada"
read palavra

for ((i=o ; i<=tamanho ; i++))do
if ((palavra[i]=palavra[((tamanho-1)-i))]
verifica=1

if(verifica -eq 0)then
echo "Igual de tras pra frente"
else
echo "Diferente de tras pra frente"
fi



  


2. Testar se palavras iguais

maxshu
schrodinger

(usa Debian)

Enviado em 14/11/2014 - 00:03h



#!/bin/bash

read -p "Digite a palavra a ser testada: " palavra

reverse="$(echo $palavra | rev)"

if [ "$reverse" = "$palavra" ]
then {
echo "Igual de tras pra frente"
}
else {
echo "Diferente de tras pra frente"
}
fi



3. Re: Ajuda com Shell Script....

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/11/2014 - 00:12h

iagolira escreveu:

#!/bin/bash

read -p "Digite a palavra a ser testada: " palavra

reverse="$(echo $palavra | rev)"

if [ "$reverse" = "$palavra" ]
then {
echo "Igual de tras pra frente"
}
else {
echo "Diferente de tras pra frente"
}
fi


Muito legal!

Ficou simples (Sem "cálculos" e só com comandos nativos do shell), eu mesmo ja estava "viajando" aqui tentando fazer como exercício.


4. Re: Ajuda com Shell Script....

andre
truster0

(usa Outra)

Enviado em 14/11/2014 - 00:37h

iagolira escreveu:

#!/bin/bash

read -p "Digite a palavra a ser testada: " palavra

reverse="$(echo $palavra | rev)"

if [ "$reverse" = "$palavra" ]
then {
echo "Igual de tras pra frente"
}
else {
echo "Diferente de tras pra frente"
}
fi


Amigoo , Funcionou que uma maravilha :)

Mais e se eu quiser fazer digamos que pelo modo mais longo, comparando as posiçoes dos vetores.
Ex:
Primeira = Ultima
Segundo = Antepenúltima
e assim por diante ate comparar todo o vetor(a palavra)


5. Outra resposta

maxshu
schrodinger

(usa Debian)

Enviado em 14/11/2014 - 15:07h


#!/bin/bash

read -p "Digite a palavra a ser testada: " palavra

cont0=1
cont1=$(echo $palavra | wc -m)
contchar=$(echo "$cont1-$cont0" | bc)


for(( i=1; i <= $contchar; i++ ))
do
c1[$i]=$(echo "$palavra" | cut -b $i)
done

h=$(echo "$contchar+$cont0" | bc)
for(( k=1; k<=$contchar; k++ ))
do
j=$(echo "$h-$k" | bc)
c2[$j]=$(echo ${c1[$k]})
done

if [ "$(echo ${c2[@]})" == "$(echo ${c1[@]})" ]
then {
echo "Igual de tras pra frente"
}
else {
echo "Diferente de tras pra frente"
}
fi



6. Re: Ajuda com Shell Script....

Andre Ribeiro da Costa
andr3ribeiro

(usa Arch Linux)

Enviado em 14/11/2014 - 15:47h

iagolira manja dos paranauê!


7. Re: Ajuda com Shell Script....

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/11/2014 - 20:09h

Caramba... Que festival de sandices!

Para começo de conversa, como pode alguém dar como dica o uso de vetores?

Por mais que o comando “rev” torne o exercício uma moleza, desde quando ele é comando nativo do shell?

Por que um loop usando “cut”?

Não é necessário usar “wc“ para medir o comprimento de uma variável. E é um desperdício usar “bc“ para operações simples como uma simples subtração.


Abaixo há uma exemplo de como fazer usando somente comandos nativos do Bash. Não sei se seria mais rápido do que usando o “rev”.

#!/bin/bash

while (($#)); do
word=${1,,}
left=0
right=$((${#word}-1))
is_palin="é"
while (( left<right )); do
if [[ "${word:$((left++)):1}" != "${word:$((right--)):1}" ]]; then
is_palin="não é"
break
fi
done
echo "'$1': ${is_palin} palindromo."
shift
done


Ele pode ser executado do seguinte modo:

$ palindromo.sh a ananas arara 12321 ARara ACaraRajadaDaJararaca
'a': é palindromo.
'ananas': não é palindromo.
'arara': é palindromo.
'12321': é palindromo.
'ARara': é palindromo.
'ACaraRajadaDaJararaca': é palindromo.


O enunciado fala em palavras. Para frases contendo espaços ou sinais de pontuação, o programa pode ser facilmente alterado para incrementar ou decrementar, respectivamente, left e right, de modo a pular caracteres que não sejam letras.


8. Outra resposta

maxshu
schrodinger

(usa Debian)

Enviado em 14/11/2014 - 21:12h

Apesar de sua asneira, seu programa está ótimo. Mas, não está de acordo com o pedido!
O que ele pede é:

Faça um script que verifique se um nome é um palíndromo. Uma palavra é um palíndromo se a sua leitura é a mesma da esquerda para a direita e vice versa. Dica: use um "array" para armazenar a palavra. Exemplo: ARARA, ANA, etc.

Seu programa está muito complicado para um usuário que está aprendendo shell!!

Ou será que não leu:

Fala pessoal , Então "não tenho muito conhecimento em shell" e preciso fazer este exercicio abaixo.

Então, o uso de vetores fica mais simples(é um programa besta, mas é simples pra que está aprendendo)!!!


9. Re: Ajuda com Shell Script....

Perfil removido
removido

(usa Nenhuma)

Enviado em 14/11/2014 - 21:16h

paulo1205 escreveu:
...

Por mais que o comando “rev” torne o exercício uma moleza, desde quando ele é comando nativo do shell?
...



Usei por vicio de linguagem, com a intenção de "comando existente no Linux" (Por encontra-lo em todos os sistemas Linux que usei), no lugar de algo próprio do interpretador de comandos, como leva a crer.
Mas de fato a frase exprime um erro de entendimento, sobre algo que eu desconhecia neste caso: O rev ser um programa externo ao shell.

Obrigado pela correção.



10. Re: Ajuda com Shell Script....

Paulo
paulo1205

(usa Ubuntu)

Enviado em 15/11/2014 - 15:05h

schodinger escreveu:

Apesar de sua asneira, seu programa está ótimo. Mas, não está de acordo com o pedido!


Aponte a asneira.

O que ele pede é:

Faça um script que verifique se um nome é um palíndromo. Uma palavra é um palíndromo se a sua leitura é a mesma da esquerda para a direita e vice versa. Dica: use um "array" para armazenar a palavra. Exemplo: ARARA, ANA, etc.


Note que você também não seguiu a dica, pois o enunciado sugere usar _um_ array, e você usou dois.

De todo modo, "dica" é diferente de obrigação. Uma coisa é dizer "faça isto usando arrays"; outra, "faça isto; minha dica é usar um array".

Além do mais, a dica dada é essencialmente ruim:

1) Para começar, strings já são uma forma de array na grande maioria das linguagens de programação. No Bash tal semelhança também é verdadeira, pois os elementos (caracteres) são dispostos em posições adjacentes de memória é possível ter acesso individualizado a cada um deles, ainda que somente de leitura.

2) Usar o que o Bash chama de array implica separar todos os caracteres do string original só para depois juntar todos novamente em posições adjacentes, só que numa outra forma, com outra notação (reforçando a razão (1)).

3) Não existe uma operação nativa com arrays do Bash que, para o problema dado, facilite a implementação. Se for para usar -- ou abusar de -- comandos externos, que se use logo o “rev”, como você mesmo sugeriu inicialmente, e que se resolva o problema numa só linha.

[[ "$palavra" = "$(echo "$palavra" | rev)" ]] && echo "E palindromo" || echo "Nao e palindromo" 


Seu programa está muito complicado para um usuário que está aprendendo shell!!


Fique à vontade para “descomplicá-lo”. Se o problema for:

- o loop que permite avaliar várias palavras numa execução só do script: basta remover a primeira e as duas últimas linhas;
- a notação aritmética do Bash: realmente um horror, mas é culpa do Bash, não minha (quem sabe trocando a linguagem de script para Python, Perl ou Ruby?);
- a notação do Bash para seleção de caráter dentro do string: também não é culpa minha, mas é comparativamente mais sucinta (e limpa) do que outras linguagens, como AWK ou Perl;
- o uso de operadores de pós-incremento e pós-decremento no meio da expressão: troque a expressão para avaliação simples de variável, e coloque o incremento e o decremento como operações à parte após o fim do if;
- a conversão de todas as letras para minúsculas antes de iniciar os testes de palíndromo: suprima, se quiser, mas o enunciado fala em _nome_, e eu entendo que "Ana" é tão palíndromo quanto "ANA" ou "ana", e que deveria ser indicado como tal.

Ou será que não leu:

Fala pessoal , Então "não tenho muito conhecimento em shell" e preciso fazer este exercicio abaixo.


Eu li sim, e muito bem. Vi, por exemplo, a referência a nome, que me fez optar por tratar minúsculas e maiúsculas como equivalentes. Vi também que o autor trazia praticamente pronto um algoritmo essencialmente correto, embora numa linguagem meio confusa (que parecia misturar shell com C, Pascal ou Python) e testando mais valores do que o estritamente necessário. Vi ainda que, quando nosso colega pediu para fazer sem o “rev”, pediu para que fosse feita uma comparação individual de elementos.

Eu discordo veementemente da postura de ensinar a fazer de modo ineficiente só porque quem está aprendendo supostamente não tem condições de compreender e aprender a forma mais refinada. Ser aprendiz não significa que é preguiçoso ou burro.

Como eu disse acima, ele praticamente acertou a ideia, errando apenas em expressá-la. Ainda que ignorasse sintaxe -- e suponho que foi por isso que veio aqui --, fez o mais difícil, mostrando que não é burro. E se não for preguiçoso, ao encontrar alguma coisa que não entenda no que você ou eu dissemos, pode perguntar de novo. De minha parte, estou predisposto a responder.

Como você respondeu descartando todo o esforço do colega e, depois, quando ele pediu que se mostrassem operações individualizadas (resgatando seu esforço original), respondeu novamente com uma forma de comparação fechada de strings (que é obviamente individualizada caráter a caráter, mas fora da visão do programa), acho que quem não andou lendo direito foi você.

Então, o uso de vetores fica mais simples(é um programa besta, mas é simples pra que está aprendendo)!!!


Simples foi sua primeira sugestão, usando “rev”. Como ela não pôde ser usada, não enxergo, no contexto do problema dado, simplicidade essencial no uso de arrays do Bash, tanto por razões estéticas como por tudo o que eu disse acima.

Veja todo o trabalho que você teve para, com auxílio (desnecessário) de programas externos, formar os arrays por meio da (artificiosa) divisão da palavra e inversão do primeiro array no segundo (que você poderia ter evitado se tivesse formado o array invertido no mesmo loop do array direto). Isso para, no fim das contas, juntar os dois novamente em strings e comparar esses dois strings como objetos elementares. Realmente acha isso didático?

Eu não acho.


11. Outra resposta

maxshu
schrodinger

(usa Debian)

Enviado em 16/11/2014 - 12:57h

rsrs Ta certo!


12. Re: Ajuda com Shell Script....

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 17/11/2014 - 16:52h

Me interessei pelo tópico e encontrei pequenas agressões aqui. Olha, pessoal... tsctsc

Segue minha contribuição. Sem arrays, pois afinal de contas o uso de array consta como "dica".

No meu caso ele testa FRASES ou mesmo textos completos. Testei até com o maior palíndromo da língua portuguesa (1650 letras, incluindo pontuações que o meu script ignora)

#!/bin/bash

read -p "Digite a palavra a ser testada (sem acentos): " palavra

palavraMAI=$palavra

# Converte tudo para maiusculas
palavraMAI=${palavra^^}

# Eliminando pontuacoes e espacos em branco
palavraMAI=${palavraMAI//[^A-Z]}


echo "DEBUG: usando a string \"$palavraMAI\""

# quantas letras tem a frase/palavra?
t="${#palavraMAI}"

# Só preciso comparar até a metade das letras
meio="$(( t / 2 ))"

# Um laco até a metade das letras
for (( i=0,j=1; i<=meio;i++,j++))
do
# C1 terá um caracter a partir de $i. Forma de pegar caracter por caracter
C1=${palavraMAI:$i:1}

# C2 terá um caracter a partir de -$j no fim. Se j for 1, pegará
# o último caracter. -2, o penúltimo e assim por diante
C2=${palavraMAI: -$j:1}

# Uma impressão de depuracao
printf "%3d [%1s] [%1s]\n" $i "$C1" "$C2"

# basta que um caracter não seja igual ao seu reverso para dizer que
# não é palíndromo. Então, se um não for, encerra.
if [ "$C1" != "$C2" ]
then
echo "Não é palíndromo"
exit 0
fi
done

# Chegou até aqui sem sair no exit? Então é palíndromo
echo "Eh um palíndromo"




01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts