次のシェルスクリプトは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も少し重複しているようです。