Se a condição não funcionar no script por ssh

1

Abaixo, o script de shell no modo SSH não está funcionando.

a variável end_pos está obtendo o valor "Stop", mas quando chega em loop IF, não verifica a condição e o loop está falhando.

Saída do comando:

 /mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \}' 

é STOP

echo \ $ end_pos; print STOP

 #!/bin/bash
ssh -t -t username@hostname << ENDSSH
  cd /logs
echo "8. We are in SSH mode now" >./log_master.txt
end_pos=\$(/mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \}')
echo \$end_pos;

 if  [ "\$end_pos" == "*Stop*" ];
  then
     echo "Loop succeed" >>./log_master.txt
 break
  else
      echo "loop failed" >>./log_master.txt
 fi
exit;
exit;
ENDSSH

Após o comentário do ilkKachu eu coloquei aspas em "ENDSSH" (esta é a única alteração que eu fiz) e executei. Ele jogou o erro. Então eu usei segundo método de colocar colchetes duplos como mostrado abaixo.

Mas quando executado abaixo do script, eu estava recebendo isto: if [[""=" Stop "]]

  #!/bin/bash
 ssh -t -t username@hostname << ENDSSH
 cd /logs
 echo "8. We are in SSH mode now" >./log_master.txt
end_pos=\$(/mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \}')
 echo \$end_pos;

if  [[ "$end_pos" == "*Stop*" ]];
 then
 echo "Loop succeed" >>./log_master.txt
 break
 else
  echo "loop failed" >>./log_master.txt
fi
exit;
ENDSSH
    
por user21546 17.05.2017 / 16:48

2 respostas

0

Eu fiz isso de maneira abaixo:

#!/bin/bash
ssh -t -t username@hostname << ENDSSH
 cd /logs
 echo "8. We are in SSH mode now" >./log_master.txt
end_pos=\$(/mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \}')
 echo \$end_pos;

if  [[ "$end_pos" =~ Stop ]];
 then
 echo "Loop succeed" >>./log_master.txt
 else
 echo "loop failed" >>./log_master.txt
fi   
exit;
ENDSSH
    
por 18.05.2017 / 09:05
2
ssh -t -t username@hostname << ENDSSH
...
echo \$end_pos;

Se você não precisa expandir nenhuma variável do shell externo para o here-doc que vai para o SSH, você pode usar << "ENDSSH" com aspas ao redor do delimitador, para ter o here-doc como se fosse um único com aspas. Então você não precisa escapar de todos os sinais $ dentro dele.

if [ "$end_pos" == "*Stop*" ]; then

Se você quiser comparar o valor com *Stop* como um padrão , e não como uma string literal , será necessário usar [[ .. ]] ou mais padrão case :

if [[ $end_pos = *Stop* ]] ; then
    ...

# or
case "$end_pos" in 
    *Stop*) echo "stop found" ;;
    *) echo "stop not found" ;;
esac

Além disso, que break parece fora de lugar, não há loop. Bash vai reclamar disso, mas somente se essa parte da instrução if for executada. Dois exit s seguidos parecem redundantes também.

    
por 17.05.2017 / 17:10