problemas com o "elif"

Iniciado por nooblinux, 15 de Fevereiro de 2010, 11:01

tópico anterior - próximo tópico

nooblinux

bom pessoal sou novo em shell script começei apenas 3 semanas.o meu problema ta em usar o elif eu achava que ele era a mesma coisa mais agora percebi que nao.

read op

case $op in
0)
exit ;;

#move arquivos de uma pasta para outra
1)
   echo "Arquivo ou pasta que deseja mover:"
   read mover
   if [ -e $mover ]; then
     echo
     echo "para onde quer movelo:"
     read mover2
     echo
   if
   if [ -e $mover2 ]; then
     mv $mover $mover2
     echo
     echo "arquivo movido com sucesso"
     echo
   else
     echo
     echo "Opção invalida."
     echo
   fi ;;     

esac
___________________________________________________________
read op

case $op in
0)
exit ;;

#move arquivos de uma pasta para outra
1)
   echo "Arquivo ou pasta que deseja mover:"
   read mover
   if [ -e $mover ]; then
     echo
     echo "para onde quer movelo:"
     read mover2
     echo
   
   elif [ -e $mover2 ]; then
     mv $mover $mover2
     echo
     echo "arquivo movido com sucesso"
     echo
   else
     echo
     echo "Opção invalida."
     echo
   fi ;;     

esac

vejam bem a única diferencia entre os os dois e que um fecha o if, e o outro continua com o elif
pelo que eu pensava ate então deveria dar no mesmo mas um funcionou e o outro não pergunto: se o "elif" e a mesma coisa do "if" porque não funcionou e se não e a mesma coisa então qual a verdadeira função do "elif".

Imoogi

pelo o que eu percebi, vc não fechou direito o if ;)


   if [ -e $mover ]; then
     echo
     echo "para onde quer movelo:"
     read mover2
     echo
  if
   if [ -e $mover2 ]; then
     mv $mover $mover2
     echo


para fechar um if deve se usar "fi"

raidicar

#2
nooblinux, if e elif não são as mesmas coisas, afinal o if testa uma condição e "se" for verdadeira ou falsa, ações que você venha a definir serão realizadas.
O else vem depois do if com a condição de ser executado apenas se a condição do "if" não for verdadeira, ou seja, seria um "senão":
if var=1; then  #A condição aqui é: Se var for igual a 1, faça.
echo "$var é igual a 1"
else #A condição aqui é: se var não for igual a 1, faça.
echo "$var não é igual a 1"
fi

O else vem para fechar o if afim de ser executado caso o if seja falso.
O Elif é uma junção de if + else, seria um "senão, se". Com ele podemos adicionar mais condições e evitar um monte de if e fi no script.
Em resumo: if = se. elif = senão, se. else = senão.
Exemplo de um script com o elif:
#!/bin/bash
echo -n "qual o valor de var:
> "
read var
if [ $var = 1 ]; then    #A condição aqui é: Se var for igual a 1, faça.
echo "$var é igual a 1"
elif [ $var = 2 ]; then  #A condição aqui é: Se var for igual a 2, faça.
echo "$var é igual a 2"
elif [ $var = 3 ]; then  #A condição aqui é: Se var for igual a 3, faça.
echo "$var é igual a 3"
else                     #A condição aqui é: se var não for igual a 1, 2 ou 3, faça.
echo "$var não é igual a 1, 2 ou 3"
fi


Sem o elif esse exemplo ficaria cheio de ifs, fis e elses:
#!/bin/bash
echo -n "qual o valor de var:
> "
read var
if [ $var = 1 ]; then               #A condição aqui é: Se var for igual a 1, faça.
echo "$var é igual a 1"
else                               #A condição aqui é: se var não for igual a 1, faça.
echo "$var não é igual a 1"
fi
if [ $var = 2 ]; then               #A condição aqui é: Se var for igual a 2, faça.
echo "$var é igual a 2"
else                               #A condição aqui é: se var não for igual a 2, faça.
echo "$var não é igual a 2"
fi
if [ $var = 3 ]; then               #A condição aqui é: Se var for igual a 3, faça.
echo "$var é igual a 3"
else                               #A condição aqui é: se var não for igual a 3, faça.
echo "$var não é igual a 3"
fi


Agora, tirando o erro que o companheiro Imoogi viu em seu script, onde trocou o fi pelo if, que me parece mais um erro de digitação, o seu script não funcionou pelo seguinte:
1 - O if e o elif teriam de tratar de uma mesma variavel.
Exemplo:
Se a variável mover for igual a 1, faça;
Senão, se a variável mover for igual a 2, faça;
Senão, faça;
fim
Veja que está sendo tratada a variavel mover. No seu script o if trata a variavel mover e o seu elif trata a variavel mover2. Tá uma salada mista isso.
Se o if tratadar da variavel $mover, os elifis a seguir tem de tratar da mesma variável. Do contrario, tudo fica uma completa zona.
É algo como se alguem te falasse: "Se o balde($mover) esta cheio, esvazie, senão, se  a privada ($mover2) estiver entupida, desentupa."
Conversa de louco, né, mudar de assundo em uma mesma frase???

2 - Existe também um erro de logica no seu script, que segue a seguinte logica:
Primeiro, Se a variavel op valer 0, o script é encerrado. Até aqui OK.
Segundo, Se a variavel op valer 1 pergunte: Arquivo ou pasta que deseja mover:
Se a resposta é armazenada na variavel $mover.Caimos no primeiro if:
if [ -e $mover ]; then
Essa condição não será executada se a variavel mover não estiver vazia.
Essa condição apenas esta sendo executada por que a variavel $mover esta vazia.
Esta vazia por que para o resultado do echo ser armazenado dentro da variavel é preciso do parametro "echo -n Pergunta"
Apenas por isso o primeiro if é executado e lhe é perguntado "para onde quer movelo:".
Essa pergunta teria sua resposta armazenada em $mover2, mas assim como no caso anterior, $mover2 não tem nenhum valor.
Então, ja que no primeiro if nada aconteceu, caimos no segundo if:
if [ -e $mover2 ]; then
Nesse caso, como esse mover2 esta vazio, afinal, não foi informado qualquer valor a ele, essa condição é verdadeira e será executado o comando mv $mover $mover2.
Porém $mover e $mover2 não tem valor e por isso o comando mv irá gerar um erro pela falta do origem e destino.

Por isso, para esse seu script o uso do elif não é indicado.
Veja como ele ficaria se tentássemos forçar e inserir o elif:
#!/bin/bash
#move arquivos de uma pasta para outra
op=1
case $op in
0)
exit ;;
1)
  echo -n "Arquivo ou pasta que deseja mover:"
  read mover
  if [ ${#mover} -gt 0 ]; then
    echo
    echo -n "para onde quer movelo:"
    read mover2
    echo
  elif [ -e $mover ]; then
    echo "Saindo... Não foi especificado arquivo ou pasta a ser movido."
    exit
  fi
  if [ -e $mover2 ]; then
    echo "saindo... Não foi especificado destino dos dados."
  elif [ ${#mover2} -gt 0 ]; then
    echo "movendo $mover para $mover2"
    echo
    mv $mover $mover2
    echo "arquivo movido com sucesso"
    echo
    exit
  fi ;;
esac


obs: if [ ${#mover} -gt 0 ]; then = Isso serve para contar quantos caracteres existem na variavel $mover e se dentro da variavel tiver mais de 0 caracteres, a condição será verdadeira e as ações dentro desse if serão executadas.
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.

nooblinux

muito abrigado amigo "Raidicar" me ajudou bastante agradeço por sua atenção
tirou realmente minha duvida sobre o "elif" e aida adcionou coisas ao meu pouco conhecimento.
obrigado mesmo.