下面的 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