Linux

如果條件在 ssh 上的腳本中不起作用

  • May 19, 2017

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

變數 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 [[“”=“ 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 \$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

我通過以下方式做到了這一點:

#!/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
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 語句的那一部分被執行。連續兩個exits 似乎也有點多餘。

引用自:https://unix.stackexchange.com/questions/365646