Если условие не работает в скрипте над ssh

Ниже сценария оболочки в режиме SSH не работает.

переменная end_pos получает значение «Стоп», но когда он приходит в цикл IF, он не проверяет условие, и цикл становится неудачным.

Вывод команды:

/mysql/mysql/bin/mysqlbinlog mysql-bin.000001 |tail -10| grep -w -A1 154 | grep -w "Stop" |awk '{print \$10}' 

STOP

echo \ $ end_pos; печать 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; 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 

2 Solutions collect form web for “Если условие не работает в скрипте над ssh”

 ssh -t -t username@hostname << ENDSSH ... echo \$end_pos; 

Если вам не нужно расширять какие-либо переменные из внешней оболочки до здесь-документа, который идет на SSH, вы можете использовать << "ENDSSH" с кавычками вокруг разделителя, чтобы иметь здесь-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 выглядит неуместным, нет петли. Баш будет жаловаться на это, но только если эта часть if-statement будет выполнена. Два exit в строке кажутся немного избыточными.

Я сделал это ниже:

 #!/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 
  • `test` и` [`- разные бинарные файлы, любая разница?
  • Некоторые ошибки возникли, когда я установил lucene, модуль perl!
  • shell scripting - несколько тестов равенства в одном выражении if
  • Поймать неожиданный ввод одиночного символа в bash
  • Как узнать, существует ли каталог?
  • Невозможно сравнить результат lsb_release с строкой в ​​Bash
  • bash: -eq vs. == и `bc` тип вывода
  • Правильное литье типов в сценарии оболочки для использования с циклом while и модулем
  • Множественный оператор, который включает специальные символы, используя при возникновении ошибок
  • Linux и Unix - лучшая ОС в мире.