SSH 스크립트에서 조건이 작동하지 않는 경우

SSH 스크립트에서 조건이 작동하지 않는 경우

다음 쉘 스크립트는 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"(내가 변경한 유일한 변경 사항)에 따옴표를 추가하고 실행했습니다. 오류가 발생했습니다. 그런 다음 두 번째 방법을 사용하여 아래와 같이 이중 괄호를 배치했습니다.

그러나 아래 스크립트를 실행하면 다음과 같은 결과가 나타납니다. 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

관련 정보