Решение проблемы с некорректным склеиванием строк в bash скриптах, запускаемых через cygwin на Windows
Стояла задача организации мониторинга Bareos бэкап сервера, работающего на базе Windows. Готовые решения были для Linux и написаны на Bash. Решено было, чтобы скрипты опроса bareos и скрипты отправки списка клиентов на Zabbix сервер через Cygwin.
Скрипт, формирующие список клиентов обращается в PostgresSQL БД и формирует JSON для заббикса. В нем и возникла ситауация, когда строки не конкатенируются (склеиватся), а накладываются друг на друга.
Следующий скрипт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash source "$(dirname $0)/bareos-zabbix.conf" bareosClients="$($sql "select Client.Name from Client")" JSON="{ \"data\":[" SEP="" for client in $bareosClients; do client="$(echo $client | sed 's/\-/_/g')"; JSON="$JSON$SEP{\"{#CLIENT}\":\"${client}\"}" SEP=", " done; JSON=$JSON"]}" echo $JSON |
давал на выходе одну некорректную строку вида:
1 | "}]}{"{#CLIENT}":"client_133 |
А должен был выдать корректный JSON
1 | { "data":[{"{#CLIENT}":"client_98"}, {"{#CLIENT}":"client_197"}, {"{#CLIENT}":"client_133"}]} |
Получается, что код вида JSON=$JSON»]}» не склеивал строку, а накладывал одну на другую.
Проблема кроется в настройках возврата «каретки» (carriage-return) для Cygwin и в форматировании самого файла.
В интернете предалагается использовать утилиту dos2unix, которой нужно передать имя скрипта и после этого запускать. Однако, данной утилиты не было в моей версии cygwin, поэтому нашлось следующее решение:
Добавьте следующие команды в .bash_profile или, например, непосредственно в сам bash скрипт:
1 2 3 | export SHELLOPTS set -o igncr |
Последняя команда указывает, что нужно игнорировать окончане строки (\r) Windows при исполении скрипта.