Fórum Ubuntu Linux - PT
21 de Maio de 2013, 21:50 *
Olá, Visitante. Faça o login ou registre-se.
Perdeu o seu e-mail de ativação?

Login com nome de usuário, senha e duração da sessão
Notícias: Sejam todos bem-vindos e fiquem atentos às regras de utilização do fórum e política de privacidade.
 
   Home   Ajuda Regras Pesquisa Login Registre-se  
Anúncios
Páginas: [1]   Ir para o fundo
  Imprimir  
Autor Tópico: Pequeno Script dando erro[Resolvido]  (Lida 878 vezes)
hfa2010
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 25


UP THE IRONS!!! \m/


Ver Perfil
« em: 23 de Maio de 2012, 08:04 »

Olá pessoal, estou tentando conhecer mais scripts, e estou tendo guia o livro Linux, Guia prático do Morimoto. Estou então, tentando seguir um dos exemplos dele e tentando criar um script baseado no youtube-dl, mas ele não funciona.
Esse é o "código fonte":
Código:
#!/bin/sh
echo "Digite a url do vídeo:"
read urlvideo
echo "Digite o formato(default(1), mp4(2), 3gp(3) ou flv(4))"
read formato
if  "$formato" = "1" ; then
youtube-dl -cil $urlvideo
elif  "$formato" = "2" ; then
youtube-dl -cil -f 18 $urlvideo
elif  "$formato" = "3" ; then
youtube-dl -cil -f 17 $urlvideo
elif  "$formato" = "4" ; then
youtube-dl -cil -f 35 $urlvideo
else
echo "Você não especificou um formato corretamente."
fi

Essa é a resposta:
Código:
henrique@henrique-Inspiron-N4050:~$ sh baixaryoutube.sh
Digite a url do vídeo:
http://www.youtube.com/watch?v=yKfd2fREITw&feature=g-u-u
Digite o formato(default(1), mp4(2), 3gp(3) ou flv(4))
2
baixaryoutube.sh: 6: baixaryoutube.sh: 2: not found
baixaryoutube.sh: 8: baixaryoutube.sh: 2: not found
baixaryoutube.sh: 10: baixaryoutube.sh: 2: not found
baixaryoutube.sh: 12: baixaryoutube.sh: 2: not found
Você não especificou um formato corretamente.
Na verdade eu queria fazer com strings em vez dos números, o que não deu certo, mas acabou que nem com números funcionou.

Só para observação, no código escrito está 18, 35, 17, etc, porque no man do youtube-dl está assim:

 -f FMT, --format=FMT
           Specify the video format (quality) in which to download the video.

           For youtube.com, in particular, the meaning of the format codes is
           given as:

           WebM video at 480p: 43
           WebM video at 720p: 45
           H264 video in MP4 container at 480p: 18
           H264 video in MP4 container at 720p: 22
           H264 video in MP4 container at 1080p: 37
           H264 video in FLV container at 360p: 34
           H264 video in FLV container at 480p: 35
           H263 video at 240p: 5
           3GP video: 17
« Última modificação: 13 de Junho de 2012, 14:06 por hfa2010 » Registrado
irtigor
Equipe Ubuntu
Usuário Ubuntu
*****
Deslogado Deslogado

Mensagens: 3.212


Delete, delete, delete!


Ver Perfil
« Responder #1 em: 23 de Maio de 2012, 10:14 »

Você precisa fazer um teste
Código:
# Teste pra numero
formato=1
if [ $formato -eq 1 ]; then
    #faça alguma coisa
fi

# Teste para string
formato=formatoAbc
if [ "$formato" = "formatoAbc" ]; then
    #faça alguma coisa
fi

---------
Links: http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29
http://mywiki.wooledge.org/BashPitfalls
http://wiki.bash-hackers.org/commands/classictest
Registrado
raidicar
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 579


Quad Shot of Ubuntu


Ver Perfil
« Responder #2 em: 24 de Maio de 2012, 17:06 »

Segue abaixo seu script corrigido e melhorado, por assim dizer:
Código:
#!/bin/bash
inicio() {
  clear;
  read -p "Digite a url do vídeo: ==>>  " urlvideo;
  download
}

download() {
  clear;
  echo "url digitada: $urlvideo";
  echo;
  echo "Digite o numero referente a opcao desejada:";
  echo "1 - default.";
  echo "2 - mp4.";
  echo "3 - 3gp.";
  echo "4 - flv.";
  echo "5 - Voltar e Informar outra url.";
  echo "6 - Sair.";
  echo
  read -p ": ==>>  " formato;

  case $formato in
    1) echo; youtube-dl -cil $urlvideo; echo; echo "Finalizado!"; fim;;
    2) echo; youtube-dl -cil -f 18 $urlvideo; echo; echo "Finalizado!"; fim;;
    3) echo; youtube-dl -cil -f 17 $urlvideo; echo; echo "Finalizado!"; fim;;
    4) echo; youtube-dl -cil -f 35 $urlvideo; echo; echo "Finalizado!"; fim;;
    5) inicio;;
    6) clear; echo; echo "Finalizado!"; exit;;
    *) echo;echo "Você não especificou um formato corretamente.";echo;read pause;clear; download;;
  esac
}

fim() {
  echo;
  read -n1 -p "Deseja Sair? [S/N]: ==>>  " sair;
  if [ $sair = "N" ] || [ $sair = "n" ]; then
    inicio;
  elif [ $sair = "S" ] || [ $sair = "s" ]; then
    echo;exit;
  else
    echo "Opcao Invalida.";clear;
    fim;
  fi
}
inicio


Resultado do teste:
Código:
Digite a url do vídeo: ==>>  http://www.youtube.com/watch?v=yfUZND486Ik&feature=g-vrec

url digitada: http://www.youtube.com/watch?v=yfUZND486Ik&feature=g-vrec

Digite o numero referente a opcao desejada:
1 - default.
2 - mp4.
3 - 3gp.
4 - flv.
5 - Voltar e Informar outra url.
6 - Sair.

: ==>>  2

[youtube] Setting language
[youtube] yfUZND486Ik: Downloading video webpage
[youtube] yfUZND486Ik: Downloading video info webpage
[youtube] yfUZND486Ik: Extracting video information
[download] The Invention of Lying (2009) OFFICIAL TRAILER-yfUZND486Ik.mp4 has already been downloaded

Finalizado!

Deseja Sair? [S/N]: ==>>  s
root@nrt:/


Com relação aos erros apresentados no seu script:
Existem erros nas condições (if e elifs) e por isso erros são apresentados e o script cai direto no else.

Correção:

Transforme isto:if  "$formato" = "1" ; then
Nisto: if  [ $formato = 1 ] ; then.
Ou seja, sem as aspas duplas e com colchetes.
Respeite os espaços, não deixe os caracteres de dentro dos colchetes grudados no mesmo.
Siga a mesma ordem nas demais condições:
elif [ $formato = 2 ]; then
elif [ $formato = 3 ]; then
elif [ $formato = 4 ]; then
Isso ja basta.

Se deseja fazer utilizando letras, como disse acima, segue abaixo codigo para comparar letras:
Código:
  #! /bin/bash
  read -n1 -p "Deseja Sair? [S/N]: ==>>  " sair;
  # -n1 faz com que o programa siga após 1 caracter ser digitado, Pode-se usar -n1, -n2, -n....
  # Essa opção, se retirada, permite que mais caracteres sejam digitados.
  # É ideal apenas para casos onde é preciso limitar a quantidade de caracteres informados pelo usuário.
  if [ $sair = "N" ] || [ $sair = "n" ]; then
    echo "Escolhido NAO."
  elif [ $sair = "S" ] || [ $sair = "s" ]; then
    echo "Escolhido SIM."
  else
    echo "Opcao Invalida.";
  fi

ok?
« Última modificação: 24 de Maio de 2012, 17:16 por raidicar » Registrado

Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.
irtigor
Equipe Ubuntu
Usuário Ubuntu
*****
Deslogado Deslogado

Mensagens: 3.212


Delete, delete, delete!


Ver Perfil
« Responder #3 em: 24 de Maio de 2012, 18:16 »

Transforme isto:if  "$formato" = "1" ; then
Nisto: if  [ $formato = 1 ] ; then.

Assim você está fazendo comparação de strings, até funciona, mas se a intenção é fazer comparação aritmética use "-eq" ou -- no bash e alguns outros shells -- "((" no lugar do test.
Registrado
raidicar
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 579


Quad Shot of Ubuntu


Ver Perfil
« Responder #4 em: 25 de Maio de 2012, 19:48 »

Assim você está fazendo comparação de strings, até funciona, mas se a intenção é fazer comparação aritmética use "-eq" ou -- no bash e alguns outros shells -- "((" no lugar do test.

Está certo, eu até concordo contigo, mas....

Quando possível, usar o igual (=) e diferente (!=) no lugar de não equivalente (-ne) e equivalente (-eq) evita ter de tratar msg de erro na tela se o valor da variável é um valor não numérico:

Ex1: read -p "valor=> " valor; if [ $valor = 1 ]; then echo "valor = $valor"; else echo "valor # $valor"; fi
Ex2: read -p "valor=> " valor; if [ $valor != 1 ]; then echo "valor = $valor"; else echo "valor # $valor"; fi
Com o igual (=) e diferente (!=), não tenho msg de erro ao inserir uma letra ou simbolo, etc...

Ex3: read -p "valor=> " valor; if [ $valor -ne 1 ]; then echo "valor = $valor"; else echo "valor # $valor"; fi
Ex4: read -p "valor=> " valor; if [ $valor -eq 1 ]; then echo "valor = $valor"; else echo "valor # $valor"; fi
Se eu insiro um um valor não numérico, como a letra "K" ou o simbolo *, e estou usando não equivalente (-ne) ou equivalente (-eq), tenho de tratar o erro:
bash: [: k: esperado expressão de número inteiro
bash: [: *: esperado expressão de número inteiro
-ne e -eq exigem que a variável seja numérica, mas se letras ou caracteres forem informadas, tem-se erro na condição.
Nem sempre queremos cairo no else é ai que a coisa pode se complicar e uma ação não desejada ser executada por erro humano.

Por isso, quando os valores são inseridos pelo teclado, tento não utilizar -eq e -ne, tento utiliza-los apenas quando sei que o valor da variável será numérica, ou seja, um valor buscado ou recebido automaticamente pela máquina, sem intervenção humana. Do contrario, vale mais o case ou o = e !=

É isso ou mais um if com a expressão [[ $1 = ?(+|-)+([0-9]) ]][/b] para validar a variável e tratar informações inseridas incorretamente.
Registrado

Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.
hfa2010
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 25


UP THE IRONS!!! \m/


Ver Perfil
« Responder #5 em: 28 de Maio de 2012, 13:44 »

Muito Obrigado Pessoal, eu estou acompanhando, mas só vou poder testar e refazer o código daqui à alguns dias quando estiver em casa rsrs Obrigados à todos, e em especial pro raidicar!!! vlw!
Registrado
irtigor
Equipe Ubuntu
Usuário Ubuntu
*****
Deslogado Deslogado

Mensagens: 3.212


Delete, delete, delete!


Ver Perfil
« Responder #6 em: 30 de Maio de 2012, 17:49 »

Se você espera a string "1" e o usuário digita "f", o programa não deveria continuar (a entrada deve ser tratada usando string ou numero), por isso insisto no que é mais lógico: se espera numero, trate como tal, evita que o programa tenha comportamentos estranhos.

Outra coisa, se vai ler da entrada padrão (ou seja, não tem controle do que vai digitado), a varável deveria ter aspas no teste pra não ocorrer expansão
Código:
mkdir -p /tmp/teste && cd /tmp/teste
touch 1
valor=*
if [ $valor = 1 ]; then
    echo "Opção 1 - $valor = 1" # vai entrar aqui, porque o shell expande o asterisco pro arquivo '1'
else
    echo "Opção 2 - $valor != 1" # deveria entrar aqui, porque asterisco é diferente de '1'.
fi
Registrado
Páginas: [1]   Ir para o topo
  Imprimir  
 
Ir para:  

Powered by MySQL Powered by PHP Tema desenvolvido por FaBMak e n3t0
Powered by SMF 1.1.18 | SMF © 2006-2009, Simple Machines
© 2013 Canonical Ltd. Ubuntu e Canonical são marcas registradas da Canonical Ltd.
XHTML 1.0 válido! CSS válido!