Если условие не работает в скрипте над 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 
  • awk системный вызов с инвертированным эффектом
  • shell scripting - несколько тестов равенства в одном выражении if
  • Модернизирован, чтобы проверить ветвь по ошибке в debian ... как я могу вернуться к стабильной?
  • `test` и` [`- разные бинарные файлы, любая разница?
  • Как я могу использовать команды bash, если тесты и найти команды вместе?
  • Использование -n и -z в тестировании встроено - Bash
  • Как использовать отрицание команды в цикле while с grep в сценарии оболочки?
  • bash: -eq vs. == и `bc` тип вывода
  • Interesting Posts

    Файловый менеджер общих диалогов, таких как Open или Save

    Ошибки системного учета на MacOS X (Yosemite)?

    Темы XFCE Cursor не устанавливаются

    Удалите тишину из аудиофайлов, оставляя пробелы

    `du -s .` и` du -hs .` дают разные результаты (на OS X)

    Может ли быть любая переменная, используемая в конфигурационном файле?

    Как добавить системный вызов в linux kernel 4.x

    как мне управлять зависимостями для этого вручную установленного файла rpm?

    Запуск сценария sh: «Permission denied», несмотря на исполняемый бит и права root

    Вывод терминала неверно

    Используются ли какие-либо инструменты openldap для контроля авторизации идентификации авторизации?

    Как я могу читать информацию на CD-Text с компакт-дисков

    Как я могу клонировать конкретное рабочее пространство для других выходов?

    Как использовать раскладку клавиатуры Dvorak в командной строке GRUB2 LUKS?

    Chromium 32.0.1700.19 не может отображать китайский титул

    Linux и Unix - лучшая ОС в мире.