如果条件在 ssh 脚本中不起作用

如果条件在 ssh 脚本中不起作用

下面的 shell 脚本在 SSH 模式下不起作用。

变量 end_pos 正在获取值“Stop”,但是当它进入 IF 循环时,它不会检查条件并且循环失败。

命令输出:

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

是停止

回显\$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”中添加了引号(这是我所做的唯一更改)并执行了。它引发了错误。然后我使用第二种方法放置双括号,如下所示。

但是当执行下面的脚本时,我得到了这个: 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*图案,而不是作为文字字符串,您需要使用[[ .. ]]或更标准的case

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

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

而且,这break看起来不合适,没有循环。 Bash 会对此进行抱怨,但前提是 if 语句的该部分被执行。exit连续两个s 似乎也有点多余。

答案2

我已经通过以下方式完成了此操作:

#!/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
 else
 echo "loop failed" >>./log_master.txt
fi   
exit;
ENDSSH

相关内容