Linux
如果條件在 ssh 上的腳本中不起作用
下面的 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 語句的那一部分被執行。連續兩個exit
s 似乎也有點多餘。