다음 쉘 스크립트는 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