Problema com shell [RESOLVIDO]

1. Problema com shell [RESOLVIDO]

Rafael
supertchuco

(usa Solaris)

Enviado em 17/03/2011 - 12:47h

Bom dia a todos estou tentando fazer um comando shell, mas eu não entendo o porque dele não funcionar...

O tal comando é esse:
grep "\<patch id=*\>" /opt/SBM75/patches/sbm-patches.xml | awk '{print $2}' | sed -ne 's/.*=//g' -e 's/\"//gp' | while read LINE; do if [ "$FINAL" = "" ] then FINAL=$LINE else FINAL="$FINAL, $LINE" fi echo $FINAL; done

O mesmo apresenta esse erro: -bash: syntax error near unexpected token `done'

Só que se eu faço esse comando (tirando o if e colocando um echo)funciona...

Então creio que o problema está na estrutura do if dentro do while...que não estou conseguindo enxergar...






  


2. Re: Problema com shell [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/03/2011 - 14:05h

falta ponto-e-vírgula em algumas partes:

grep "\<patch id=*\>" /opt/SBM75/patches/sbm-patches.xml | awk '{print $2}' | sed -ne 's/.*=//g' -e 's/\"//gp' | while read LINE; do if [ "$FINAL" = "" ]; then FINAL=$LINE ; else FINAL="$FINAL, $LINE"; fi; echo $FINAL; done


3. Re: Problema com shell [RESOLVIDO]

Rafael
supertchuco

(usa Solaris)

Enviado em 17/03/2011 - 16:56h

Kra é quase isso....

quando eu rodei esse seu comando deu os echos certo, mas... eu tirei o echo:

grep "\<patch id=*\>" /opt/SBM75/patches/sbm-patches.xml | awk '{print $2}' | sed -ne 's/.*=//g' -e 's/\"//gp' | while read LINE; do if [ "$FINAL" = "" ]; then FINAL=$LINE ; else FINAL="$FINAL, $LINE"; fi; done

o comando roda sem erros....

Após dou um echo na variavel Final e a mesma está vazia, por que isso ?


4. Re: Problema com shell [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 17/03/2011 - 17:32h

talvez a variável $FINAL esteja recebendo um valor que contém espaço, nesse caso precisa usar aspas ao imprimir o valor com o echo:
echo "$FINAL"

é bom sempre usar aspas ao definir variáveis, assim evita erros semelhantes, como no caso do seu comando:
FINAL=$LINE (troque por FINAL="$LINE")


5. Re: Problema com shell [RESOLVIDO]

Rafael
supertchuco

(usa Solaris)

Enviado em 17/03/2011 - 18:04h

Não é isso, vi em outros fóruns que algumas pessoas tiveram esse problema, e não teve solução aparente, além de trocar por um for.....
Putz que porcaria esse while.


6. Re: Problema com shell [RESOLVIDO]

Rafael
supertchuco

(usa Solaris)

Enviado em 18/03/2011 - 10:48h

Resolvi assim:

LIST=`grep "\<patch id=*\>" /opt/SBM75/patches/sbm-patches.xml | awk '{print $2}' | sed -ne 's/.*=//g' -e 's/\"//gp'`
for LINE in $LIST
do
if [ "$OTTO" = "" ]
then
OTTO=$LINE
else
OTTO="$OTTO, $LINE"
fi
done
fi;

Me parece que há um problema de escopo no while que ao sair do laço perde o valor da variável....não entendi isso afinal..


7. Re: Problema com shell [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 18/03/2011 - 12:40h

acho que algo assim funcionaria:

FINAL=
codigo | while read LINE; do
if [[ "$FINAL" = "" ]; then
FINAL="$LINE"
else
FINAL="$FINAL, $LINE"
fi
done
echo $FINAL

não?


8. Re: Problema com shell [RESOLVIDO]

Rafael
supertchuco

(usa Solaris)

Enviado em 18/03/2011 - 13:33h

Pode até ser, mas na real eu queria deixar como uma unica linha...como estava no inicio do tópico..