SSHスクリプトで条件が機能しない場合

SSHスクリプトで条件が機能しない場合

次のシェルスクリプトはSSHモードでは機能しません。

end_pos変数は "Stop"値を取得しますが、IFループに入ると条件を確認せずにループが失敗します。

コマンド出力:

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

やめる

Echo \ $ end_pos印刷が停止します。

 #!/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 \$10}')
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

ilkKachuのコメントに従って、「ENDSSH」(私が変更した唯一の変更)に引用符を追加して実行しました。エラーが発生しました。次に、第2の方法を使用して、以下のように二重括弧を配置した。

ただし、以下のスクリプトを実行すると、次の結果が表示されます。 if[["" = "止める"]];

  #!/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 \$10}')
 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

ベストアンサー1

ssh -t -t username@hostname << ENDSSH
...
echo \$end_pos;

シェルからSSHに送信されたhere-docに変数を拡張する必要がない場合は、<< "ENDSSH"here-docが一重引用符で囲まれた文字列として扱われるように区切り文字の周りに引用符を使用できます。これにより、その中のすべてのフラグを脱出する必要はありません$

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

*Stop*値を比較したい場合模様、より言葉[[ .. ]]文字列を使用するには、少なくとも1つの標準を使用する必要がありますcase

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

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

また、これはbreak間違っているようです。ループはありません。 Bashはこれについて苦情を示しますが、ifステートメントの対応する部分が実行されている場合にのみ該当します。exit連続して2つのsも少し重複しているようです。

おすすめ記事