Bash вопрос

ПРивет братья! Требуется помощь по BASH.

суть задачи:

есть список серверов.

есть xml шаблон для подключения по ssh

есть утилита читающая xml = xmllint

требуется проходя по списку серверов, менять одну строку в шаблоне и сохранять в отдельный xml-файл.

По-отдельности все команды в терминале работают. В скрипте нет.

мой вариант кода:

``Hosts=$(cat list_of_server)

templ=‘xmllint ssh_template.xml’

for host in Hosts do

$templ | sed “s/UserName>.*:SSH/UserName>$host/” > $host.xml

done

``

Выдаёёт ошибку "Синтаксическая ошибка рядос неожиданным маркером «$templ» (в строке, где sed c пайплайном).

Повторю - отдельно все строки работают с нужным результатом. В цикле не хотят.

Спецы BASH - есть идеи?

Привет! Похоже, что в твоём скрипте есть несколько ошибок, из-за которых он не работает в цикле. Давай посмотрим, как можно это исправить:

  1. Убедись, что имена переменных и конструкция цикла правильные. Переменная Hosts должна содержать список серверов.
  2. Есть небольшая ошибка в синтаксисе цикла for. Ты должен использовать $() для получения значения переменной в Bash.
  3. Также обратите внимание на использование кавычек вокруг переменных и команд.

Вот переработанная версия твоего скрипта:

#!/bin/bash

# Читаем список серверов
Hosts=$(cat list_of_server)

# Пробегаем по каждому серверу из списка
for host in $Hosts; do
  # Извлекаем содержимое из xml-шаблона, заменяем строку и сохраняем в новый файл
  xmllint ssh_template.xml | sed "s/UserName>.*:SSH/UserName>$host/" > "$host.xml"
done

Изменения:

  • Убедитесь, что for работает по каждому элементу списка; используйте $Hosts, а не Hosts.
  • Убедитесь, что команда sed получает входные данные корректно из xmllint.
  • Используйте правильные кавычки для команд и переменных.

Проверь, соответствует ли твой list_of_server правильному формату (т.е. сервера записаны в столбик). Надеюсь, это решит твои проблемы. Удачи! . Я ответил на ваш вопрос?